TCP三次握手过程与对应的Berkeley Socket APIs的介绍

1. TCP三次握手

    搜索到的一张三次握手过程的图片:

    TCP三次握手

   简单说明

   (1)主动连接的一方(称为客户端C),发送SYN_C。

   (2)被动打开连接的一方(称为服务器S),收到C的SYN_C后,会发送一个SYN_S;同时会对SYN_C作确认,返回一个ACK_S。SYN_S&ACK_S可以同时放到一个TCP segment中。

   (3)C收到SYN_S+ACK_S,发送一个ACK_C,这个ACK_C对应SYN_S。

   连接建立的过程,来回总共是3个TCP Segment。说点题外话,为什么是3个Segment呢?因为,其中一个SYN与ACK合到一个Segment中了。TCP两端同时打开的时候,就是来回交互4个segment。

 

2. 与三次握手对应的Berkeley Socket APIs

    和连接建立相关的APIs有:connect, listen, accept3个,connect用在客户端,另外2个用在服务端。对于TCP/IP protocol stack来说,TCP层的tcp_in&tcp_out也参与这个过程。我们这里只讨论这3个应用层的APIs干了什么事情。

    (1) connect

     发送了一个SYN,收到Server的SYN+ACK后,代表连接完成。发送最后一个ACK是protocol stack,tcp_out完成的。

    (2)listen

     在Server这端,准备了一个未完成的连接队列,保存只收到SYN_C的socket结构;还准备了已完成的连接队列,保存了收到了最后一个ACK的socket结构。

    (3)accept

     应用进程调用accept的时候,就是去检查上面说的已完成的连接队列,如果队列里有连接,就返回这个连接;空的,blocking方试调用,就睡眠等待,nonblocking方式调用,就直接返回,一般一"EWOULDBLOCK“ errno告诉调用者,连接队列是空的。 

 

好了,上面只是简单的介绍,没有涉及TCP的各种状态。和三次握手相关的状态有:SYN_SENT, SYN_RECVD, LISTEN和ESTABLISHED。


您的回应...

相关话题

查看全部

也许你感兴趣

换一批

热门标签

更多