|
|
|
|
公众号矩阵

3.9 TCP超时重传

《Linux高性能服务器编程》第3章TCP协议详解,本章先简单介绍一下TCP服务的特点,以及它和UDP服务的区别。本节为大家介绍TCP超时重传。

作者:游双来源:机械工业出版社|2013-06-24 12:40

3.9 TCP超时重传

在3.6节~3.8节中,我们讲述了TCP在正常网络情况下的数据流。从本节开始,我们讨论异常网络状况下(开始出现超时或丢包),TCP如何控制数据传输以保证其承诺的可靠服务。

TCP服务必须能够重传超时时间内未收到确认的TCP报文段。为此,TCP模块为每个TCP报文段都维护一个重传定时器,该定时器在TCP报文段***次被发送时启动。如果超时时间内未收到接收方的应答,TCP模块将重传TCP报文段并重置定时器。至于下次重传的超时时间如何选择,以及最多执行多少次重传,就是TCP的重传策略。我们通过实例来研究Linux下TCP的超时重传策略。

在ernest-laptop上启动iperf服务器程序,然后从Kongming20上执行telnet命令登录该服务器程序。接下来,从telnet客户端发送一些数据(此处是“1234”)给服务器,然后断开服务器的网线并再次从客户端发送一些数据给服务器(此处是“12”)。同时,用tcpdump抓取这一过程中客户端和服务器交换的TCP报文段。具体操作过程如下:

  1. $ sudo tcpdump -n -i eth0 port 5001  
  2. $ iperf –s     #在ernest-laptop上执行  
  3. $ telnet 192.168.1.108 5001  #在Kongming20上执行  
  4. Trying 192.168.1.108...  
  5. Connected to 192.168.1.108.  
  6. Escape character is '^]'.  
  7. 1234     #发送完之后断开服务器网线  
  8. 12  
  9. Connection closed by foreign host 

iperf是一个测量网络状况的工具,-s选项表示将其作为服务器运行。iperf默认监听5001端口,并丢弃该端口上接收到的所有数据,相当于一个discard服务器。上述操作过程的部分tcpdump输出如代码清单3-7所示。

代码清单3-7 TCP超时重传

  1. 1. 18:44:57.580341 IP 192.168.1.109.38234 > 192.168.1.108.5001: Flags [S], seq  
  2.    2381272950, length 0  
  3. 2. 18:44:57.580477 IP 192.168.1.108.5001 > 192.168.1.109.38234: Flags [S.], seq  
  4.    466032301, ack 2381272951, length 0  
  5. 3. 18:44:57.580498 IP 192.168.1.109.38234 > 192.168.1.108.5001: Flags [.], ack  
  6.    1, length 0  
  7. 4. 18:44:59.866019 IP 192.168.1.109.38234 > 192.168.1.108.5001: Flags [P.], seq  
  8.    1:7, ack 1, length 6  
  9. 5. 18:44:59.866165 IP 192.168.1.108.5001 > 192.168.1.109.38234: Flags [.], ack  
  10.    7, length 0  
  11. 6. 18:45:25.028933 IP 192.168.1.109.38234 > 192.168.1.108.5001: Flags [P.], seq  
  12.    7:11, ack 1, length 4  
  13. 7. 18:45:25.230034 IP 192.168.1.109.38234 > 192.168.1.108.5001: Flags [P.], seq  
  14.    7:11, ack 1, length 4  
  15. 8. 18:45:25.639407 IP 192.168.1.109.38234 > 192.168.1.108.5001: Flags [P.], seq  
  16.    7:11, ack 1, length 4  
  17. 9. 18:45:26.455942 IP 192.168.1.109.38234 > 192.168.1.108.5001: Flags [P.], seq  
  18.    7:11, ack 1, length 4  
  19. 10. 18:45:28.092425 IP 192.168.1.109.38234 > 192.168.1.108.5001: Flags [P.],  
  20.  seq 7:11, ack 1, length 4  
  21. 11. 18:45:31.362473 IP 192.168.1.109.38234 > 192.168.1.108.5001: Flags [P.],  
  22.  seq 7:11, ack 1, length 4  
  23. 12. 18:45:33.100888 ARP, Request who-has 192.168.1.108 tell 192.168.1.109,  
  24.  length 28  
  25. 13. 18:45:34.098156 ARP, Request who-has 192.168.1.108 tell 192.168.1.109,  
  26.  length 28  
  27. 14. 18:45:35.100887 ARP, Request who-has 192.168.1.108 tell 192.168.1.109,  
  28.  length 28  
  29. 15. 18:45:37.902034 ARP, Request who-has 192.168.1.108 tell 192.168.1.109,  
  30.  length 28  
  31. 16. 18:45:38.903126 ARP, Request who-has 192.168.1.108 tell 192.168.1.109,  
  32.  length 28  
  33. 17. 18:45:39.901421 ARP, Request who-has 192.168.1.108 tell 192.168.1.109,  
  34.  length 28  
  35. 18. 18:45:44.440049 ARP, Request who-has 192.168.1.108 tell 192.168.1.109,  
  36.  length 28  
  37. 19. 18:45:45.438840 ARP, Request who-has 192.168.1.108 tell 192.168.1.109,  
  38.  length 28  
  39. 20. 18:45:46.439932 ARP, Request who-has 192.168.1.108 tell 192.168.1.109,  
  40.  length 28  
  41. 21. 18:45:50.976710 ARP, Request who-has 192.168.1.108 tell 192.168.1.109,  
  42.  length 28  
  43. 22. 18:45:51.974134 ARP, Request who-has 192.168.1.108 tell 192.168.1.109,  
  44.  length 28  
  45. 23. 18:45:52.973939 ARP, Request who-has 192.168.1.108 tell 192.168.1.109,  
  46.  length 28 

TCP报文段1~3是三次握手建立连接的过程,TCP报文段4~5是客户端发送数据“1234”(应用程序数据长度为6,包括回车、换行两个字符,后同)及服务器确认的过程。TCP报文段6是客户端***次发送数据“12”的过程。因为服务器的网线被断开,所以客户端无法收到TCP报文段6的确认报文段。此后,客户端对TCP报文段6执行了5次重传,它们是TCP报文段7~11,这可以从每个TCP报文段的序号得知。此后,数据包12~23都是ARP模块的输出内容,即Kongming20查询ernest-laptop的MAC地址。

我们保留了tcpdump输出的时间戳,以便推理TCP的超时重传策略。观察TCP报文段6~11被发送的时间间隔,它们分别为0.2?s、0.4?s、0.8?s、1.6?s和3.2?s。由此可见,TCP一共执行5次重传,每次重传超时时间都增加一倍(因此,和TCP超时重连的策略相似)。在5次重传均失败的情况下,底层的IP和ARP开始接管,直到telnet客户端放弃连接为止。

Linux有两个重要的内核参数与TCP超时重传相关:/proc/sys/net/ipv4/tcp_retries1和/proc/sys/net/ipv4/tcp_retries2。前者指定在底层IP接管之前TCP最少执行的重传次数,默认值是3。后者指定连接放弃前TCP最多可以执行的重传次数,默认值是15(一般对应13~30?min)。在我们的实例中,TCP超时重传发生了5次,连接坚持的时间是15?min(可以用date命令来测量)。

虽然超时会导致TCP报文段重传,但TCP报文段的重传可以发生在超时之前,即快速重传,这将在下一节中讨论。

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

订阅专栏+更多

16招轻松掌握PPT技巧

16招轻松掌握PPT技巧

GET职场加薪技能
共16章 | 晒书包

289人订阅学习

20个局域网建设改造案例

20个局域网建设改造案例

网络搭建技巧
共20章 | 捷哥CCIE

645人订阅学习

WOT2019全球人工智能技术峰会

WOT2019全球人工智能技术峰会

通用技术、应用领域、企业赋能三大章节,13大技术专场,60+国内外一线人工智能精英大咖站台,分享人工智能的平台工具、算法模型、语音视觉等技术主题,助力人工智能落地。
共50章 | WOT峰会

0人订阅学习

读 书 +更多

网管员必读——网络组建

本书以一个模拟局域网组建为思路,介绍了与局域网组建各主要方面相关的知识及组建、配置方法。本书所介绍的内容主要包括:局域网组建规划、...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO播客