TCP的连接和释放过程

TCP的报文格式

1) 源端口和目的端口       各占2个字节,分别写入源端口和目的端口。

2) 序号              占4字节。序号范围是【0,2^32 – 1】,共2^32(即4294967296)个序号。序号增加到2^32-1后,下一个序号就又回到0。也就是说,序号使用mod 2^32运算。TCP是面向字节流的。在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置。首部中的序号字段值则是指的是本报文段所发送的数据的第一个字节的序号。例如,一报文段的序号是301,而接待的数据共有100字节。这就表明:本报文段的数据的第一个字节的序号是301,最后一个字节的序号是400。显然,下一个报文段(如果还有的话)的数据序号应当从401开始,即下一个报文段的序号字段值应为401。这个字段的序号也叫“报文段序号”。

3) 确认号      占4字节,是期望收到对方下一个报文段的第一个数据字节的序号。例如,B正确收到了A发送过来的一个报文段,其序号字段值是501,而数据长度是200字节(序号501~700),这表明B正确收到了A发送的到序号700为止的数据。因此,B期望收到A的下一个数据序号是701,于是B在发送给A的确认报文段中把确认号置为701。注意,现在确认号不是501,也不是700,而是701。

       总之:若确认号为= N,则表明:到序号N-1为止的所有数据都已正确收到。



https://www.cnblogs.com/xiangpeng/p/11030225.html

ACK确认标志位,表示确认号ack有效,每次ACK都要带上自己的序列号和别人的

SYN表示同步位,表示此次数据是为了进行序列号同步

TCP的连接详解

1,客户端第一次发起数据,需要进行序列号同步(置SYN为1),因此此次需要携带自己包的序列号X,没有数据要确认不需要ACK(ACK=0)

2.服务端收到SYN后知道是需要同步序列号,于此发出自己的包序号y,同时告诉客户端,我要x+1的包,于是ACK=1,ack=x+1

3.客户端收到 SYN 后,知道服务端是为了告诉自己同步号为y,于是告诉服务端我需要y+1的数据

总结:

第一步和第二步的操作都是为了进行序列号的同步,因此同步标志位SYN=1

第二步和第三步包含了确认前一次数据的序列号的操作,因此ACK都等于1(表示收到了序列号X的数据,期望X+1的数据)

为什么不能只两步

原因1:假设第一步执行时网不好,发了两遍,后面的包先到,建立了连接,然后关闭了,隔一会,第一个包到了,服务端又建立连接,而客户端已经关了,导致资源浪费

原因2:三次是为了确认两端的读写都没问题,第一步确认客户端写没问题,第二步确认服务端读写没问题,第三部确认客户端读没问题

TCP的连接断开过程

第一步客户端发起断开要求此时FIN结束位为1,序列号为u

服务端收到后回应ACK,告诉他我收到了ack=u+1,链接

此时服务端可以继续下发数据

下发完毕后,服务端发送fin标志,告诉客户端可以关闭了

客户端收到后发送确认ACK=1,包含ack和seq,seq是u+1,因为这时候不能发其他数据了

等待2SML时间,关闭,原因,可能服务端没客户端的确认应答,因此要等一会

参考地址

https://blog.csdn.net/qq_32998153/article/details/79680704