TCP_NODELAY和TCP_CORK基本上控制了包的“Nagle化”,Nagle化在这里的含义是采用Nagle算法把较小的包组装为更大的帧。John Nagle是Nagle算法的发明人,后者就是用他的名字来命名的,他在1984年首次用这种方法来尝试解决福特汽车公司的网络拥塞问题(欲了解详情请参看IETF RFC 896)。他解决的问题就是所谓的silly window syndrome ,中文称“愚蠢窗口症候群”,具体含义是,因为普遍终端应用程序每产生一次击键操作就会发送一个包,而典型情况下一个包会拥有一个字节的数据载荷以及40个字节长的包头,于是产生4000%的过载,很轻易地就能令网络发生拥塞,。 Nagle化后来成了一种标准并且立即在因特网上得以实现。它现在已经成为缺省配置了,但在我们看来,有些场合下把这一选项关掉也是合乎需要的。
现在让我们假设某个应用程序发出了一个请求,希望发送小块数据。我们可以选择立即发送数据或者等待产生更多的数据然后再一次发送两种策略。如果我们马上发送数据,那么交互性的以及客户/服务器型的应用程序将极大地受益。例如,当我们正在发送一个较短的请求并且等候较大的响应时,相关过载与传输的数据总量相比就会比较低,而且,如果请求立即发出那么响应时间也会快一些。以上操作可以通过设置套接字的TCP_NODELAY选项来完成,这样就禁用了Nagle算法。
另外一种情况则需要我们等到数据量达到最大时才通过网络一次发送全部数据,这种数据传输方式有益于大量数据的通信性能,典型的应用就是文件服务器。应用Nagle算法在这种情况下就会产生问题。但是,如果你正在发送大量数据,你可以设置TCP_CORK选项禁用Nagle化,其方式正好同TCP_NODELAY相反(TCP_CORK 和 TCP_NODELAY 是互相排斥的)。下面就让我们仔细分析下其工作原理。
假设应用程序使用sendfile()函数来转移大量数据。应用协议通常要求发送某些信息来预先解释数据,这些信息其实就是报头内容。典型情况下报头很小,而且套接字上设置了TCP_NODELAY。有报头的包将被立即传输,在某些情况下(取决于内部的包计数器),因为这个包成功地被对方收到后需要请求对方确认。这样,大量数据的传输就会被推迟而且产生了不必要的网络流量交换。
但是,如果我们在套接字上设置了TCP_CORK(可以比喻为在管道上插入“塞子”)选项,具有报头的包就会填补大量的数据,所有的数据都根据大小自动地通过包传输出去。当数据传输完成时,最好取消TCP_CORK 选项设置给连接“拔去塞子”以便任一部分的帧都能发送出去。这同“塞住”网络连接同等重要。
总而言之,如果你肯定能一起发送多个数据集合(例如HTTP响应的头和正文),那么我们建议你设置TCP_CORK选项,这样在这些数据之间不存在延迟。能极大地有益于WWW、FTP以及文件服务器的性能,同时也简化了你的工作。
分享到:
相关推荐
本文将深入探讨TCP_Socket.zip中的SocketDemo.exe及其相关的TCP/IP Socket编程知识。 TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,它确保数据包在网络中按顺序...
【标题】"HPSocket.Net-develop_hpsocket.net_HPSocket_.net_socket_tcp_" 提供的知识点主要集中在使用C#编程语言实现基于TCP协议的Socket通信上,并且涉及到一个名为"HPSocket.Net"的库。HPSocket.Net是针对.NET...
在`Socket-TCP-IP`压缩包中,可能包含了示例代码,展示了如何在C++、Java或Python等语言中实现这些步骤。通过分析和运行这些代码,可以更直观地理解TCP Socket通信的工作原理。 此外,为了调试和优化TCP通信,我们...
TCP套接字(TCP Socket)是网络编程中的一个重要概念,它是基于传输控制协议(TCP)的应用层接口,用于实现两台计算机之间的可靠、面向连接的数据通信。本教程将围绕TCP套接字,深入讲解相关知识,并以一个简单的TCP...
标题中的"UDP-TCP.rar"表明这是一个关于网络传输协议UDP(User Datagram Protocol)与TCP(Transmission Control Protocol)的压缩文件,而"TCP UDp_TCP-UDP_tcp/udp socket_网络UDP TCP"则进一步强调了涉及的内容...
标题中的“Simple-TCP---Server.zip”表明这是一个关于TCP服务器的LabVIEW项目,而“SOCKET LABVIEW labview socket tcp tcp lab”进一步确认了这个项目是使用LabVIEW的Socket编程来实现TCP通信。标签“socket_...
文件"socket-fram-work"可能是框架的源代码或编译后的库文件。在深入研究之前,开发者需要了解如何配置和使用这个框架,包括如何初始化Socket实例,如何设置和处理心跳,以及如何发送和接收消息。此外,熟悉错误处理...
在Linux系统中,TCP...通过阅读"Linux-socket-TCP-ClientServer.txt"文件,可以深入了解这些细节和完整的代码实现。学习和掌握TCP socket编程对于开发网络应用程序至关重要,因为它是互联网通信的核心部分。
在TCP客户端中,一般会创建socket,设置必要的套接字选项,然后执行connect()函数来尝试连接服务器。在服务器端,使用bind()和listen()函数将套接字绑定到特定端口并开始监听,然后accept()函数用于接收客户端的连接...
- **发送请求**:使用Socket对象将请求帧通过TCP发送到服务器。 - **接收响应**:等待服务器的响应,同样通过Socket对象接收。 - **解析响应**:客户端解析接收到的Modbus响应,提取所需的数据。 - **显示结果**...
在C++中,虽然没有内置的TcpClient和TcpServer类,但我们可以使用socket API来实现TCP通信。Windows系统中,可以使用Winsock库;在Unix-like系统中,通常使用POSIX socket接口。实现步骤与C#类似,包括创建socket、...
提供的`.chm`文件是Windows帮助文档格式,通常包含详细的API函数说明、参数解释、返回值、示例代码以及错误代码列表,是开发过程中不可或缺的参考资料。 总之,《W5300驱动设计API--WIZnet_SOCKET_APIs_v1.2.1》为...
基于官方dtu_demo.lua的修改,配合:合宙Air105|Socket|UDP |TCP/IP|W5500|Serial 串口|透传|DTU|网络测试助手|双机互联|内网测试|官方demo|学习(8-3):Socket网络接口-双机互联透传使用:双机互连DTU透传, AIR...
在本示例中,“Socket-TCP-Echo.rar”包含了一个简单的TCP服务器和客户端程序,用于演示如何使用Java进行TCP通信。下面将详细解释相关知识点。 1. **TCP(Transmission Control Protocol)**: TCP是一种面向连接的...
本篇将深入探讨"SOCKET_TCP_tcp_"这一主题,即如何使用Python进行TCP协议的实现。 TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。它在Internet协议族中与IP(互联网协议)共同工作,为应用层提供可靠...
在标题中提到的"socket-file-ftp-for-timeout.rar",可以理解为一个关于使用Socket实现FTP文件传输并包含超时功能的示例代码压缩包。"ftp_socket"指的是通过Socket接口实现FTP协议,"socket_file_tcp"表示使用TCP...
Socket编程是网络通信的一种基础方式,它允许不同设备之间通过TCP/IP协议交换数据。在工业自动化领域,PLC是广泛使用的设备,用于控制各种生产过程和机械操作。这个项目的目标是创建一个通用的服务器端应用,可以...
描述 "server TCP IP with socket" 进一步确认了这个主题,表明内容可能涉及如何在Java中使用Socket编程来创建一个TCP服务器。 TCP(传输控制协议)和IP(互联网协议)是网络通信的基础,它们一起构成了互联网协议...
总之,“communication-software-server_java_tcp_源码”项目提供了一个使用Java Socket API实现的TCP聊天服务器,它展示了如何在Java中建立稳定的网络连接,处理客户端的连接和消息交换,以及如何进行多线程处理以...
本资源“tcp_server_socket.rar”提供了一个TCP服务器的源代码实现,这对于理解和开发基于TCP的网络应用非常有帮助。下面,我们将详细探讨TCP服务器、socket_server、socket_tcp以及socket服务器相关的知识点。 ...