1. 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