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

2019-04-15 15:05发布

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。 另外,三次握手的常见问题参考下面的文章:
http://blog.csdn.net/herm_lib/article/details/6019970