影响TCP 网络时延的因素
- 硬件速度
- 网络和服务器的负载
- 请求和响应报文的尺寸
- 客户端和服务器之间的距离
- TCP 协议的技术复杂性
TCP协议产生的时延
- TCP 连接建立握手;
- TCP 慢启动拥塞控制;
- 数据聚集的 Nagle 算法;
- 用于捎带确认的 TCP 延迟确认算法;
- TIME_WAIT 时延和端口耗尽。
TCP连接建立
TCP连接的建立,需要经历3个报文的交互过程,沟通相关连接参数,这个过程称为三次握手(three-way handshake)。
因此,如果在每次发送数据之前,都重新建立一次TCP连接,那么建立连接的耗时将对性能产生较大的影响(特别是在发送少量数据的情况下)。
三次握手四次挥手(参考自coolshell)
优化方法
建立长连接,多次数据的发送复用同一条连接。
TCP慢启动
如果在发送方和接收方之间存在多个路由器和速率较慢的链路,此时多个发送方一开始便向网络发送多个报文段,由于受网络传输和服务端处理能力的影响,一些中间路由器必须缓存分组,并有可能最终耗尽存储器的空间,因而更多的报文发送将使网络出现拥塞。
TCP慢启动(slow start),就是用于防止因特网的突然过载和拥塞的一种流量控制机制。
慢启动为发送方的TCP增加了一个窗口:拥塞窗口(congestion window),简称cwnd。
刚建立连接时,拥塞窗口被初始化为1个报文段。每收到一个ACK,拥塞窗口就增加一个报文段。发送方取拥塞窗口与接收方通告窗口中的最小值作为发送上限。
也就是说,TCP连接会随着时间进行自我“调谐”,起初会限制连接的最大速度,如果数据成功传输,会随着时间的推移提高传输的速度。
注:拥塞窗口是发送方使用的流量控制,而通告窗口则是接收方使用的流量控制。
优化方法
采用长连接,避免每次建立连接后的慢启动。
Nagle算法
在广域网上,小分组会增加网络拥塞出现的可能性。Nagle算法(根据其发明者John Nagle命名)旨在收集这些小分组,以一个分组的方式发出去,以提高网络效率。
该算法要求一个TCP连接上最多只能有一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其他的小分组。
该算法的优越之处在于它是自适应的:确认到达得越快,数据也就发送得越快。
Nagle 算法会引发以下性能问题
- 当报文无法填满一个分组时,需要等待其他额外数据;
- Nagle算法会阻止数据的发送,直到有确认分组抵达为止,但确认分组自身会被延迟确认算法延迟 100 ~ 200 毫秒。
算法伪代码
if there is new data to send
if the window size >= MSS and available data is >= MSS
send complete MSS segment now
else
if there is unconfirmed data still in the pipe
enqueue data in the buffer until an acknowledge is received
else
send data immediately
end if
end if
end if
优化方法
对于实时性要求较高的应用场景,可以通过设置TCP_NODELAY参数来关闭Nagle算法,提高性能。
延时确认算法
通常TCP在接收到数据时并不立即发送ACK;相反,它推迟发送,以便将ACK与需要沿该方向发送的数据一起发送。
有时称这种现象为数据捎带ACK,由于确认报文通常很小,所以TCP允许在发往相同方向的输出数据分组中对其进行“捎带”。
绝大多数实现采用的时延为200ms,也就是说,TCP将以最大200ms的时延等待是否有数据一起发送。
通常,延迟确认算法会引入相当大的时延。
优化方法
根据所使用操作系统的不同,可以调整或禁止延迟确认算法。(这个方法我没尝试过)
TIME_WAIT状态
TIME_WAIT状态也称为2MSL等待状态。
当某个 TCP 端点关闭 TCP 连接时, 会在内存中维护一个小的控制块,用来记录最近所关闭连接的 IP 地址和端口号。
这类信息只会维持一小段时间,通常是所估计的报文段最大生存时间的的两倍(称为2MSL,通常为2分钟左右),以确保在这段时间内不会创建具有相同地址和端口号的新连接。
实际上,这个算法可以防止在两分钟内创建、关闭并重新创建两个具有相同IP地址和端口号的连接。
将 2MSL 的值取为 2 分钟是有历史原因的。很早以前,路由器的速度还很慢,人们估计,在将一个分组的复制副本丢弃之前,它可以在因特网队列中保留最多一分钟的时间。现在,最大分段生存期要小得多了。
报文段最大生存时间MSL(Maximum Segment Lifetime),是指任何报文段被丢弃前在网络中的最长生存时间。
RFC 793 [Postel 1981c]指出MSL为2分钟。然而,实现中的常用值是30秒,1分钟或2分钟。
优化方法
- 打开tcp_tw_reuse,让程序可以重用处于TIME_WAIT状态的端口。如果使用tcp_tw_reuse,必需设置tcp_timestamps=1(默认值)。(这个对于快速重启某些服务很有用,特别是服务端程序)
- 打开tcp_tw_recycle,让处于TIME_WAIT状态的套接字更快的回收。
对于该设置,通常由专业运维同事在服务器上做好相关配置。
关于TIME_WAIT问题,更详细介绍可阅读耗子叔的这篇文章《TCP 的那些事儿(上)》:
https://coolshell.cn/articles/11564.html
参考
《TCP/IP详解卷1: 协议》
《HTTP权威指南》
https://coolshell.cn/articles/11564.html
维基百科
转载请注明来源:http://zhanjia.iteye.com/blog/2428102
个人公众号
二进制之路
相关推荐
- **拥塞控制**:为了防止网络拥塞导致的数据包丢失和延迟增加,TCP协议内置了一系列的拥塞控制策略。这些策略通常包括慢启动(slow start)、拥塞避免(congestion avoidance)以及快速重传和恢复(fast retransmit and ...
【TCP协议网络聊天程序】 TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在网络聊天程序中,TCP协议确保数据的可靠传输,包括数据包的顺序接收和错误检查。它通过...
当客户端使用TCP协议连接时,它会发送一个连接请求,服务器接收并确认后,双方即可通过各自的socket进行数据交换。对于UDP,客户端可以直接向服务器的特定端口发送数据报,而无需预先建立连接。 TCP和UDP的使用取决...
TCP/IP(Transmission Control Protocol/Internet Protocol)网络协议是互联网上最基础、最重要的通信协议栈,它定义了数据在网络中传输的规则和标准。TCP/IP协议族由多个层次组成,包括应用层、传输层、网络层和...
在OPNET仿真软件中实现FAST TCP协议,涉及到了TCP序列号比较机制以及TCP状态变量初始化等关键知识点。本文将深入探讨这些概念,并解释其在TCP协议中的作用。 ### 序列号比较机制 TCP(传输控制协议)在数据传输...
在IT行业中,网络通信是软件开发中的重要环节,TCP(传输控制协议)和UDP(用户数据报协议)作为两种主流的传输层协议,被广泛应用于各种网络应用中。本篇将详细阐述TCP/UDP网络调试工具及其在开发过程中的作用。 ...
KV-EP21V、KV-7500、KV-5500、KV-NC1EP等型号都支持这些协议,可以与上位机通过TCP/IP网络进行数据交换。上位机通过TCP通讯协议可以发送控制指令给PLC,也可以接收PLC的运行数据和状态信息。 KV系列PLC的通讯设置...
TCP协议分析工具是网络诊断和调试的重要手段,可以帮助我们理解网络通信过程中的细节,例如数据包的发送、接收、重传等。模拟客户端则允许我们主动发起连接,测试服务器的响应,或者模拟特定的网络行为。 TCP协议...
【基于TCP协议的网络聊天室】是一个利用MFC(Microsoft Foundation Classes)库开发的网络聊天应用程序,它模拟了像QQ这样的即时通讯软件的功能。在这个项目中,TCP(Transmission Control Protocol)协议被用作数据...
Mudbus TCP协议允许PLC和其他设备通过TCP/IP网络进行数据交换,支持多点连接,提高了系统的灵活性和可靠性。 TCPModbus协议则是在Modbus RTU(远程终端单元)基础上构建的,通过TCP/IP层来实现在局域网或互联网上的...
### TCP协议三次握手过程分析 #### 一、TCP协议简介 传输控制协议(Transmission Control Protocol,简称TCP)是...通过这种机制,TCP协议能够确保在网络环境中提供稳定可靠的连接服务,为各种应用提供了坚实的基础。
通过这个TCP实验,我们可以深入理解TCP协议的工作原理,掌握如何在实际编程中应用TCP协议,为后续的网络编程打下坚实的基础。此外,这个实验也有助于培养我们的问题解决能力,因为可能会遇到网络延迟、丢包、拥塞等...
在模拟TCP协议时,我们要实现三次握手建立连接、四次挥手断开连接、滑动窗口机制、以及TCP序列号和确认应答机制等。 UDP(User Datagram Protocol)则是另一种传输层协议,它是无连接的,不保证数据的顺序或可靠性...
TCP协议适用于需要高可靠性的网络应用,例如网页浏览、文件传输、电子邮件等。 - **IP(网际协议)**:是TCP/IP协议族中的网络层协议,负责定义和管理网络设备的IP地址,并确定数据包从源到目的地的路径。IP协议...
《网络调试助手 NetAssist:深入理解UDP与TCP协议在网络数据收发中的应用》 在IT行业中,网络调试是开发者日常工作中不可或缺的一部分。对于网络应用的开发和优化,理解并熟练掌握网络通信协议至关重要。本文将围绕...
### TCP协议与UDP协议的区别 #### 一、TCP/IP协议栈概述 为了更好地理解TCP协议与UDP协议之间的区别,我们先来简要回顾一下TCP/IP协议栈的基本结构。TCP/IP协议栈是一个分层的网络通信模型,主要包括四个层次: 1...
【TCP协议与LoadRunner简介】 TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,是互联网上应用最广泛的一种网络协议。它为两台机器之间的数据通信提供了规则和标准,...
在IT领域,网络通信是至关重要的组成部分,而TCP(传输控制协议)和UDP(用户数据报协议)则是两种最常用的网络传输协议。本篇文章将详细阐述这两种协议的基本概念、工作原理以及它们之间的区别,同时介绍一种能够...