TCP协议三次握手和四次分手以及数据传输过程

1、三次握手

TCP是面向连接的,在面向连接的环境中,开始传输数据之前,在两个终端之间必须先建立一个连接。建立连接同步的过错称为三次握手,具体过程如下:

image.png

(1)当主机A想同主机B建立连接,主机A会发送SYN给主机B,初始化序列号seq=x。主机A通过向主机B发送SYS报文段,实现从主机A到主机B的序列号同步,即确定seq中的x。

(2)主机B接收到报文后,同意与A建立连接,会发送SYN、ACK给主机A。初始化序列号seq=y,确认序号ack=x+1。主机B向主机A发送SYN报文的目的是实现从主机B到主机A的序列号同步,即确定seq中的y。

(3)主机A接收到主机B发送过来的报文后,会发送ACK给主机B,确认序号ack=y+1,建立连接完成,传输数据。

2、传输过程

在建立连接后,TCP将以全双工方式传输数据,在同一时间主机A与主机B之间可以同时进行TCP报文段传输,并对接收到的TCP报文进行确认。具体过程如下:


image.png

(1)假设主机A向主机B发送1800字节的数据,主机B向主机A发送1000字节的数据。

(2)主机A取seq=8001作为第一个字节的编号(seq不一定从0开始,0-(2^32 - 1)之间的随机数),由于数据长度是1800,字节编号就是8001-9801。同理主机B编号是18001-19000。

(3)当对字节编号后,TCP就给每个报文分配一个序号,该序号即这个报文中的第一个字节的编号,在图中主机A数据被拆分两个报文段(主机A限定发送有效值1000字节,所以会分两段发送一个1000字节,一个800字节),因此第一段报文序号是seq=8001,第二段报文序号seq=9001。同理主机B一段报文发送,序号是seq=18001。

(4)接收端接收到报文需要进行确认,TCP确认号被定义下一个希望接收到的字节的编号,所以当主机B成功接收到主机A发送的第二段报文时,发现报文的字节编号9001-9800,所以主机B发送给主机A确认序号ack=9801。同理主机A接收到主机B发送的报文字节编号是18001-19000,会给主机B发送确认报文,确认序号ack=19001。

(5)报文传输完成,这里主机A最后一次只发送一个ack,代表主机A已经没有数据发送给主机B了。为了提高TCP传输数据效率,接收端主机不会对发送端主机发送的每一段报文都进行报文确认,而是当同时接收到多个报文后再发送确认报文ack。

3、四次分手


image.png

(1)当主机A的应用程序通知TCP数据已经发送完毕时,TCP向主机B发送一个带有FIN附加标记的报文段,初始化序号seq=x。

(2)主机B收到这个FIN报文段,并不立即用FIN报文段回复主机A,而是想主机A发送一个确认序号ack=x+1,同时通知自己的应用程序,对方要求关闭连接(先发ack是防止主机A重复发送FIN报文)。

(3)主机B发送完ack确认报文后,主机B 的应用程序通知TCP我要关闭连接,TCP接到通知后会向主机A发送一个带有FIN附加标记的报文段,初始化序号seq=x,ack=x+1。

(4)主机A收到这个FIN报文段,向主机B发送一个ack确认报文,ack=y+1,表示连接彻底释放。
原文链接:https://blog.csdn.net/changhangshi/java/article/details/82144453

你可能感兴趣的:(TCP协议三次握手和四次分手以及数据传输过程)