程序员linux c/c++杂谈我用 Linux

tcp包头、三次握手、四次挥手、状态

2019-06-14  本文已影响23人  cpp加油站

1. TCP协议

1.1 TCP数据包头

要了解三次握手和四次挥手,首先需要了解下TCP数据包头的结构,如下:


tcp包头

注意:TCP数据包是没有IP地址的,只有端口

1.2 三次握手协议

在利用TCP实现源主机和目的主机通信时,目的主机必须同意,否则TCP连接无法建立。为了确保TCP连接的成功建立,TCP采用了一种称为三次握手的方式,三次握手方式使得“序号/确认号”系统能够正常工作,从而使它们的序号达成同步。如果三次握手成功,则连接建立成功,可以开始传送数据信息。
三次握手:为应用程序提供可靠的通信连接,适合于一次传输大批数据的情况,并适用于要求得到响应的应用程序。
其三次握手分别为:

运行客户进程的源主机A的TCP通知上层应用进程,连接已经建立。
当源主机A向目标主机B发送第一个数据报文段时,其序号仍为X+1,因为前一个确认报文段并不消耗序号。
当运行服务进程的目标主机B的TCP收到源主机A的确认后,也通知其上层应用进程,连接已经建立。至此建立了一个全双工的连接。

1.3 tcp断开连接四次挥手

tcp建立连接是三次,但断开连接却要四次,是因为tcp是全双工的,两个方向上都需要进行关闭。

注意 : FIN和SYN一样,也要消耗一个序号。理论上服务器在TCP连接关闭时发送的终止数据包中,只有终止位置是1,然后客户端进行确认。但是在实际的 TCP实现中,在终止数据包中,确认位和终止位是同时置为1的,确认位置为1表示对最后一次传输的数据进行确认,终止位置为1表示关闭该方向的TCP连 接。

1.4 TCP有哪些状态

一般我们可以使用netstat查看当前socket状态。

1.5 TIME_WAIT为什么要等2MSL才会变为CLOSED

有两个原因:

注意:报文段的生存周期是一个MSL,所以在2MSL后,不会还存在迟到的报文段。

本人在简书上写的内容均为本人原创,转载需经本人同意,欢迎转载分享,请注明出处。

上一篇下一篇

猜你喜欢

热点阅读