开发者学堂课程【Linux网络进阶 - TCP/IP协议及OSI七层模型:CCNP 必备:Linux 网络基础知识入门及 tcp 协议】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/552/detail/7627
CCNA 必备:Linux 网络基础知识入门及 tcp 协议(三)
五、TCP 协议特性
1.工作在传输层
2.面向连接协议
3.全双工协议(双向的传输)
4.半关闭
5.错误检查
6.将数据打包成段,排序
7.确认机制
8.数据恢复,重传
9.流量控制,滑动窗口
10.拥塞控制,慢启动和拥塞避免算法
六、TCP 包头
决定TCP 特性的因素,位于传输层,传输层的报文头部TCP在中间,它的外层是网络层的头部,TCP是传输层,传输层在里面,内层应该是会话层的头部。
TCP处于网络层和会话层中间的位置,对应字母T,T字母前面是网络层,再往后是S,表示会话层。传输层是中间传输层的第一种格式,当然也有UDP 格式,传输层的TCP 头部的报文格式如下图所示。该图是按照二进制绘制的。
一行是0到31个位,共32位。其中0到15表示源端口,16到31表示目标端口。
1、端口号定义: TCP 协议 PORT
端口号相当于应用程序的唯一标识,即一个程序的地址。传输层通过 port 号,确定应用层协议Port number:
tcp: 传输控制协议,面向连接的协议;通信前需要建立虚拟链路;结束后拆除链路0-65535
udp:User Datagram Protocol,无连接的协议0-65535
而0-1023这是互联网数字分配机构(IANA)进行分配的,如果自己开发一个软件,必然要使用某个端口号,此时不要用0到1023了,因为国际上有关于1023的标准定义,已经被一些通用著名程序使用了,可以使用高一些的端口号。
像22(ssh)、著名的HTTP(80)、HTTPS(443)、dns(53)、ftp(21,20等)、tftp(69)、smtp(25)、pop3(110)、imap(143)、ternet(23)、mysql(3306)、Oracle(1521)、sql server(1433)。1024-49151用户端口或注册端口,要求并不严格,分配给程序注册为某应用使用。
49152-65535:动态端口或私有端口,客户端程序随机使用的端口,其范围的定义:/proc/sys/net/ipv4/ip_local_port_range
2、源端口、目标端口
计算机上的进程要和其他进程通信是要通过计算机端口的,而一个计算机端口某个时刻只能被一个进程占用,所以通过指定源端口和目标端口,就可以知道是哪两个进程需要通信。源端口、目标端口是用 16 位表示的,可推算计算机的端口个数为 2^16 个
3、序列号
表示本报文段所发送数据的第一个字节的编号。在 TCP连接中所传送的字节流的每一个字节都会按顺序编号。
由于序列号由 32 位表示,所以每 2^32 个字节,就会出现序列号回绕,再次从 0 开始
4、确认号
表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。也就是告诉发送发:
我希望你(指发送方)下次发送的数据的第一个字节数据的编号是这个确认号
5、数据偏移
表示 TCP 报文段的首部长度,共 4 位,由于 TCP 首部包含一个长度可变的选项部分,需要指定这个 TCP 报文段到底有多长。它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。
该字段的单位是 32 位(即 4 个字节为计算单位), 4位二进制最大表示 15,所以数据偏移也就是 TCP 首部最大 60字节
1.标记位
- URG
表示本报文段中发送的数据是否包含紧急数据。后面的紧急指针字段(urgent pointer)只有当 URG=1 时才有效
- ACK
表示是否前面的确认号字段是否有效。ACK=1,表示有效。只有当 ACK=1 时,前面的确认号字段才有效。
TCP 规定,连接建立后,ACK 必须为 1,带 ACK 标志的 TCP 报文段称为确认报文段
- PSH
提示接收端应用程序应该立即从 TCP 接收缓冲区中读走数据,为接收后续数据腾出空间。
如果为 1, 则表示对方应当立即把数据提交给上层应用,而不是缓存起来,如果应用程序不将接收到的数据读走,就会一直停留在 TCP
接收缓冲区中
- RST
如果收到一个 RST=1 的报文,说明与主机的连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。
或者说明上次发送给主机的数据有问题,主机拒绝响应,带 RST 标志的 TCP 报文段称为复位报文段
- SYN
在建立连接时使用,用来同步序号。当 SYN=1,ACK=0 时,表示这是一个请求建立连接的报文段;当 SYN=1,ACK=1 时,表示对方同意建立连接。 SYN=1 ,说明这是一个请求建立连接或同意建立连接的报文。
只有在前两次握手中 SYN 才置为 1,带 SYN 标志的 TCP 报文段称为同步报文段
- FIN
表示通知对方本端要关闭连接了,标记数据是否发送完毕。如果 FIN=1,即告诉对方:“我的数据已经发送完毕,你可以释放连接了”,带 FIN 标志的 TCP 报文段称为结束报文段
7、通讯的面向连接:
TCP是面向连接的协议,所谓面向连接就是在通讯之前要确保对方与自己有一个可靠的连接,它是通过三个过程来实现,俗称三次握手。例如,A想和B通讯,假设A是客户端,B是服务器地址和服务器。
客户端想连服务器的时候,如果用TCP协议,例如我们平时使用的HTTP 服务都是基于TCP协议,在进行通讯的时候,第一步要检查有没有可靠连接,会把标记的SYN(同步位)打为1,第一次的数据就以这样的方式发送出去了,发出去时也存有一个序列号,记作x。
发出去对方收到以后,确认并回ACK,然后再发一个确认表示第二步回来的信息收到了。