TCP建立连接时用到的字段
- 序号
seq
:表示在一个TCP连接中传送的字节流中每一个字节都按顺序进行编号,该字段就表示本报文段所发送数据的第一个字节的序号。(序号是建立连接时产生的随机数开始的) - 确认号
ack
:期望收到对方下一个报文段的第一个数据字节的序号,如果确认号为n,就说明到序号为n-1为止的数据都已经正确收到 - 确认位
ACK
:确认位为1时,确认号ack
才有效,在建立连接后,所有传输数据的报文段都必须把ACK
置为1 - 同步位
SYN
:当SYN
=1时,表明是一个连接请求/连接确认报文(只有TCP三次握手协议中的前两次SYN=1) - 终止位
FIN
:当FIN
=1时,表明此报文段发送方的数据已发送完,要求释放连接
三次握手
- A向B发送连接请求报文,此时没有应用层的数据
SYN
=1,表明是一个连接请求报文ACK
=0,由于此时还没有进行建立连接,并不知道期待B端所发送数据的报文段是什么(B端还没有发送seq
字段),因此ack
也无效seq
=x,随机产生的一个数x,由于还没有涉及到应用层数据的交换,因此随机产生一个序号
- B向A返回一个连接确认报文段,允许连接,同时B端为该TCP连接分配缓存和变量,也没有应用层数据
SYN
=1,表明是一个连接确认报文ACK
=1,由于在第一步B端已经收到了A的seq
字段,因此ack
确认号已经有效ack
=x+1,由于A端发来的seq
=x,此时ack
=x+1,可用于A端进行校验,该连接确认报文对应刚才发送的连接请求报文,同时表明接下来接收数据时希望从序号为x+1的字节开始接收seq
=y,由于还是没有涉及到应用层数据的交换,因此也产生一个随机数y
- A回应B的连接确认报文(确认的确认),并为该TCP连接分配缓存和变量,与前两次报文不同的是,该报文可以携带数据
ACK
=1,表示ack
字段有效(除了第一次握手时,其他的报文ACK位都为1)seq
=x+1,表示从序号为x+1的序号开始传输数据ack
=y+1,表示下次报文希望收到B端序号为y+1开始的数据
四次挥手
- A向B发送连接释放报文段,停止发送数据,主动关闭TCP连接
FIN
=1,表示此报文段的的发送方(A)所有的数据已经发送完毕,主动要求断开连接ACK
=0,由于是主动断开的连接,因此并没有收到B端的seq
字段,因此ack
字段无效seq
=u,用于标识该请求释放连接报文段(取决于A向B发送数据量的大小)
- B端返回一个确认报文段,此时A—>B方向的连接就释放了,该TCP连接处于半关闭状态(A不再向B传送数据),同时该报文端也可以携带B传向A的数据。
ACK
=1,由于B端依然还在给A端传送数据,因此B传向A的ack
字段有效seq
=v,取决于上一次B向A传送的数据传到了哪个序号ack
=u+1,用于标识该报文段是刚才A发送给B的请求释放报文段的确认报文段- 由于A向B传送的数据已经发送完,所以A端无需回复该确认报文段,只需要等待A端向B端发送连接释放报文段,表示B端的数据也发送完毕
- B端的数据也发送完成,主动发送释放连接报文段,主动关闭TCP连接
FIN
=1,表示该报文段是一个释放连接报文段ack
=u+1,由于上次发送的确认字段A端没有回应,因此ack
字段依然是u+1ACK
=1,由于该报文段的ack
字段有效,因此该标志位为1seq
=w,用于标识该字段,其值取决于之前发送数据的大小
- A端返回一个确认报文段,在等待计时器设置的2MSL(最长报文寿命)后,连接彻底关闭
ACK
=1,由于该报文端携带有效的ack
字段,因此该标志位为1seq
=u+1ack
=w+1,作用于seq
的作用都是为了对应B向A发送的连接释放报文段- 等待2MSL的作用,如果该报文段在传输的过程中丢失,B端没有收到A端发送的确认报文段,B端就会在等待2MSL以后再次发送一次释放连接报文段,此时A再次收到B端发送的连接释放报文段以后,就知道上一次发送的确认报文段丢失了,就会再次向A发送一次确认报文段。