关于TCP三次握手的一些理解

TCP的三次握手建立通信 笔记

全文预备:

  • TCP:传输控制协议,是一个面向连接的协议,为用户程序提供可靠的全双工字节流。
  • 分节:分节是TCP传输层的协议数据单元,一般就是TCP发送的最小单元
  • 数据序列号:TCP通过给每个字节关联一个序列号对所发送的数据进行排序,以保证数据接收后能正常恢复
  • SYN:SYN是一个分节,不携带数据,只有TCP首部、IP首部以及TCP选项

下面是一张从《UNIX网络编程卷1》截下来的TCP三次握手流程图:

TCP三次握手流程

  1. 服务器必须先先准备好接收来自客户端的连接请求(通过socket、bind、listen函数做初始化工作,然后由accept阻塞的等待客户端的请求到来) --这称为被动打开
  2. 客户端调用connect函数向服务器发起连接请求—称为主动打开;这一步中客户端发送一个SYN分节给服务器,告诉服务器客户端将在连接中发送的数据的初始序列号J。 这完成了第一次握手!
  3. 服务器接收到客户的SYN分节后,必须回发确认(ACK);同时自己也要发送一个SYN分节(不能只是服务器直到客户端的数据的初始序列号,客户端也要知道服务器的数据初始序列号才能正常的双向通信);一般服务器在单个分节中发送SYN和ACK,而不是分成两个分节发送。这就是第二次握手了。
  4. 既然服务器收到客户端的SYN分节要回应一个确认(ACK),那么客户端收到服务器的SYN分节后也应该进行确认(ACK)。所以客户端收到服务器的SYN后回发的ACK就是第三次握手。

下面是我对TCP三次握手的一些理解:

  1. TCP既然号称是可靠的,那么最基础的就是要保证双方的正常收发功能,并且是双方都知道双方的收发功能正常(即我不但要知道我能正常收发,我也要知道另一方能正常收发;并且严格的说这里的收发正常应该包括或者更多的指代客户端与服务器间的通信通道正常)
  2. 那么怎么知道自己和对方的收发是正常的呢?
  3. 在第一次握手中,服务器能正常接收到客户端的SYN分节,说明了服务器的接收功能以及客户端的发送功能正常
  4. 第二次握手客户端确认了自己的收、发功能都正常(想一想,第二次握手能成功是建立第一次握手成功的基础上的,即客户发送正常基础上),以及服务器的收、发功能正常(同理,如果服务器无法收(第一次握手),或无法发(第二次握手)都不能完成第二次握手)
  5. 客户端已经知道双方正常收发了,但服务器还不能完全知道双方收发是否正常,这时就需要第三次握手了
  6. 客户端收到来自服务器ACK+SYN,并回发ACK后,就能connect返回了;而服务器需要收好客户端的ACK后才能返回。换种说法就是,客户发起第三次握手后就返回了,而服务器要完成第三次握手后才能结束返回,相比客户端是有一定的延时的

解释一下这句话“严格的说这里的收发正常应该包括或者更多的指代客户端与服务器间的通信通道正常”,TCP一般不用于单个电脑中的通信,数据从一端发送出还未到达另一端前的通信通道称为信道,信道相对来说是不太稳定的,这会导致数据在信道中丢失的可能性更大;所以收发正常包含的是发送后接收前信道的通信正常。


参考:

  1. 《UNIX网络编程卷1:套接字联网API》第二章

猜你喜欢

转载自blog.csdn.net/weixin_41629848/article/details/98648910
今日推荐