报文格式
源端口/目的端口:
序号,确认号:连接建立时确认号是:收到数据的序号+1;数据传输时:确认号是:收到数据的序号+收到数据包中所带数据的长度(不包含IP头部和TCP头部,是纯数据的长度)。
首部长度:TCP首部的长度,以4字节为单位:>=20字节(4*5),>=60字节(4*15)。
保留位:
控制字段:
窗口大小:发送端定义自己的TCP的窗口大小,以字节为单位。接收端收到报文后知道对段的窗口大小是多少,然后决定自己的行为,不发送数据,或下次发送数据的多少。
检验和:TCP的检验和是强制的。计算检验和时需要添加伪首部,如下:
紧急指针:紧急标志位被置时有效。
选项:可选。
TCP状态转换
TCP连接建立
三次握手
1. SYN
2. SYN/ACK
3. ACK
MSS
MSS: Maxitum Segment Size 最大分段大小。
建立tcp连接的两端在三次握手时会协商tcp mss大小,具体如下: pc1 发出syn报文,其中option选项填充的mss字段一般为1460,同样www server收到syn报文后,会发送syn+ack报文应答,option选项填充的mss字段也为1460;协商双方会比较syn和syn+ack报文中mss字段大小,选择较小的mss作为发送tcp分片的大小。通过比较,协商双方的tcp mss都是1460。
对于网络层的上层协议而言(我们以TCP/IP协议族为例)网络层IP协议会检查每个从上层协议下来的数据包的大小,并根据本机MTU的大小决定是否作“分片”处理。分片最大的坏处就是降低了传输性能,本来一次可以搞定的事情,分成多次搞定,所以在网络层更高一层(就是传输层)的实现中往往会对此加以注意!所以会在IP数据包包头里面加上一个标签:DF(Donot Fragment)。这样当这个IP数据包通过多个路由其进行网络传输的时候,如果遇到MTU小于IP数据包的情况,转发设备就会根据要求丢弃这个数据包。然后返回一个错误信息给发送者。这样往往会造成某些通讯上的问题,不过幸运的是大部分网络链路都是MTU1500或者大于1500。
如下图:
1. SYN中的MSS
2. SYN/ACK中的MSS
数据传输
TCP连接终止
1. 全关闭:三次握手
2. 半关闭:4次握手
一个方向: FIN=> ACK
另一个方向:FIN=> ACK
TCP连接复位
差错控制
1. 检验和: 通过数据包的检验和确保数据没有被串改。
2. 确认:TCP采用确认来证实收到了数据包。
3. 重传:在一个数据包发送时,它会被保存到一个队列中,直至被确认为止。当重传计时器超时,或者发送方收到该队列中第一个数据包的三个重复的ACK时,该报文被重传。
4. 失序的报文:失序的报文到达时,不会被丢弃,而是被暂时保存下来,直到缺损的报文到达。但是TCP不会把失序的报文交付给应用程序。
拥塞控制
待整理
TCP中的计时器
重传计时器
启动计时器重传丢失的数据包。
持续计时器
持续计时器为了处理”零窗口值”后发送方不再发送数据包,如果发送方无法获得窗口开启的信息,则永远无法发送数据,这里启动一个计时器,定时的去探测对端的状态。
保活计时器
连接两端都没有数据传送处于空闲状态,设置一个计时器定时发送探测报文,确认对端处于活动状态。
时间等待计时器
Time-Wait计时器在TCP每个状态时设置一个计时器限制在每个状态上的时间。