我理解的三路握手

来源:互联网 发布:c4d r18 for mac迅雷 编辑:程序博客网 时间:2024/05/20 21:19

    建立一个TCP连接时会发生三路握手的情形。

    (1)一般都是客户主动发起连接,称为 主动打开 active open。客户先调用socket函数创建一个套接字,做了相应的初始化工作之后,然后调用connect函数向相应的服务器发起连接,此时客户TCP发送了一个SYN同步分节,这个同步分节告诉服务器,客户将在(待建立的)连接中发送的数据的初始序列号。在连接建立之前,connect函数会阻塞。

    (2)一般而言,在客户发起连接之前,服务器已经准备好了接受外来的连接,这是通过调用socket、bind、listen函数来完成的,我们把服务器的这种等待客户发起连接的行为称作 被动打开 passive open。服务器接下来会调用accept函数,服务器进程在accept调用中被投入睡眠,它等待某个客户连接的到达并被内核接受。等到服务器接受到客户发来的同步分节后,必须做相应的 确认 ACK。若客户发送的SYN初始序列号为J,则服务器的ACK确认号为J+1。与此同时,服务器也带发送一个SYN 同步分节,这个SYN含有服务器将在同一连接中发送的数据的初始序列号,设为K。注意,服务器是在一个分节中发送SYN和ACK的。(要是分两次发送,就不是三路,而是四路握手了)

    (3)客户接收到服务器的SYN及ACK之后,必须也要做相应的确认,即发送ACK至服务器,此时的确认号为K+1。

   以上即为TCP连接时的三路握手。

    握手完毕之后,服务器的accept函数返回,返回值是一个称为 已连接描述符 connected descriptor的新描述符(一般程序均作connfd)。该描述符用于与新近连接的那个客户通信。accept函数为每个连接到本服务器的客户返回一个新描述符。然后服务器的read函数处于阻塞状态。

原创粉丝点击