MSS

MSS,全称是Maximum Segment Size,最大分段大小,它用来标识一个TCP分段所携带的数据的最大长度

在建立TCP连接的时候,需要进行三次握手(handshake),在握手的过程中,两端都会通过SYN包中的MSS选项,通知对方自己所能接受的MSS,在握手结束后,就会协商出一个双方都能接受的MSS(就是,双方的MSS中的较小值)。


SequenceNumber和AcknowledgementNumber

sequence number是针对分段自身的,它表示 分段所携带的数据的 第一个字节 的序列号。

acknowledgement number是给对端的一个反馈,告知对方下次从acknowlegedment number位置开始发送数据,ack number - 1及之前的数据已经收到了,不必重新发送


三次握手

  1. Client向Server发送一个SYN报文,请求建立连接,其中sequence number为一个随机数,记为x
  2. Server向Client回复一个SYN + ACK报文,表明:接受Client的连接请求,同时,请求与Client建立连接,其中sequence number为一个随机数,记为y;ack number为x+1
  3. Client向Server发送ACK报文,表明:接受Server的连接请求,其中ack number为y + 1
  4. 当Server收到Client发送的ACK报文后,连接建立成功

需要说明的是:在连接建立成功后,ack number的相对序号是1,seq number的相对序号是0

tcp-handshake.png


通过抓包进行说明

以 192.168.10.101:54770 连接 192.168.10.102:8000 为例,进行说明

第一次握手:

06:45:22.385709 IP (tos 0x0, ttl 64, id 56081, offset 0, flags [DF], proto TCP(6), length 60)
192.168.10.101.54770 > 192.168.10.102.8000: Flags [SYN], cksum 0x964a, seq 2867899478, win 29200, options [mss 1460,sackOK,TS val 358215 ecr 0,nop,wscale 7], length 0

说明:

 

第二次握手:

06:45:22.386027 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 60)
192.168.10.102.8000 > 192.168.10.101.54770: Flags [SYN,ACK], cksum 0x8643, seq 3779724193, ack 2867899479, win 28960, options [mss 1460,sackOK,TS val 332216 ecr 358215,nop,wscale 7], length 0

说明:

 

第三次握手:

06:45:22.386041 IP (tos 0x0, ttl 64, id 56082, offset 0, flags [DF], proto TCP (6), length 52)
192.168.10.101.54770 > 192.168.10.102.8000: Flags [ACK], cksum 0x9642, ack 1, win 229, options [nop,nop,TS val 358216 ecr 332216], length 0

说明: