[TCP/IP] TCP链接的创建和终止

 

TCP 是支持全双工通讯的传输层协议,为了开发出更好的网络通讯应用,清楚了解其中的交互过程是很是必要的。html

 

下面用比较直白的话来描述&理解一下这个过程:编程

 

TCP 链接创建:三次握手服务器

 

服务器依次调用 socket,bind,linsten 绑定到指定本机地址,accept 阻塞等待链接。网络

 

1. 客户端调用 socket 指定本地/网络地址,connect 主动创建链接,向服务器发送 SYN 同步请求,并标记该链接通道传送数据的初始序号为 J 。socket

2. 服务器收到 SYN 请求后,响应 ACK(acknowledgement)确认收到,并标记序号为 J + 1 ;tcp

    同时服务器也向客户端发送一个 SYN 同步请求,并标记该链接通道传送数据的初始序号为 K 。htm

3. 客户端收到 SYN 请求后,对服务器响应 ACK 确认收到,并标记序号为 K + 1 。blog

 

在完成上面三步以后,TCP链接完成,客户与服务器之间能够互发数据了。开发

 

TCP 链接终止:四次挥手get

 

客户或服务器均可以主动发起 close 动做。

 

1. 客户调用 close 主动关闭链接,此时向服务器发送 FIN(finish)请求,标记链接的数据序号为 M 。

2. 服务器收到客户结束请求后,响应 ACK 确认,并标记链接数据序号为 M + 1 。

3. 服务器被动关闭,向客户发送 FIN 请求,标记链接的数据序号为 N 。

4. 客户收到服务器的 FIN 请求后,响应 ACK 确认,并标记链接的数据序号为 N + 1 。

 

完成上面四步,TCP链接终止。

 

TCP链接的分组交换

 

 

TCP 的 SO_KEEPALIVE 套接字选项

这是一个检测链接存活的选项,设置了 keep-alive 选项后,若是 2小时内在该套接字的任一方向上都没有数据交换,

TCP 就自动给对端发送一个保持存活探测分节(keep-alive probe),这是一个对端必须响应的 TCP 分节。

若是没有对 TCP 探测分节的响应,套接字待处理错误被置为 TIMEOUT,套接字关闭。

 

HTTP 的 keep-alive 属性

HTTP 是基于 TCP 之上的无状态的请求-响应式短链接,每个请求就是一个 TCP 链接,频繁的三次握手和四次挥手会浪费传输以外的大量时间。

为了提升链接和应用效率,服务端设置 keep-alive 后客户端在发起一次请求后,服务器端不会立刻关闭这个 TCP 链接,而是在一段时间内等待,有数据传输就复用这个链接。

@todo 用 tcpdump 分析链接的过程。 

 

参考文献:

Unix网络编程1 > 传输层:TCP、UDP、SCTP > TCP链接的创建和终止

Unix网络编程1 > 套接字选项 > 通用套接字选项

 

Link:http://www.cnblogs.com/farwish/p/7482038.html

相关文章
相关标签/搜索