`

tcp nodelay 分析

 
阅读更多

参考文章如下:
http://www.iteye.com/topic/1110883?page=2

第一次数据包交互过程

18:18:49.344878 IP 10.210.214.51.54042 > 10.210.214.51.8000: P 1:7(6) ack 1 win 1025 <nop,nop,timestamp 1350350382 1350345381>
        0x0000:  4500 003a 96e9 4000 4006 e1c9 0ad2 d633  E..:..@.@......3
        0x0010:  0ad2 d633 d31a 1f40 1071 3443 0fde a75a  ...3...@.q4C...Z
        0x0020:  8018 0401 c237 0000 0101 080a 507c b62e  .....7......P|..
        0x0030:  507c a2a5 6865 6c6c 6f20                 P|..hello.

18:18:49.345069 IP 10.210.214.51.8000 > 10.210.214.51.54042: . ack 7 win 1024 <nop,nop,timestamp 1350350382 1350350382>
        0x0000:  4500 0034 05ff 4000 4006 72ba 0ad2 d633  E..4..@.@.r....3
        0x0010:  0ad2 d633 1f40 d31a 0fde a75a 1071 3449  ...3.@.....Z.q4I
        0x0020:  8010 0400 c231 0000 0101 080a 507c b62e  .....1......P|..
        0x0030:  507c b62e                                P|..

18:18:49.345209 IP 10.210.214.51.54042 > 10.210.214.51.8000: P 7:14(7) ack 1 win 1025 <nop,nop,timestamp 1350350382 1350350382>
        0x0000:  4500 003b 96ea 4000 4006 e1c7 0ad2 d633  E..;..@.@......3
        0x0010:  0ad2 d633 d31a 1f40 1071 3449 0fde a75a  ...3...@.q4I...Z
        0x0020:  8018 0401 c238 0000 0101 080a 507c b62e  .....8......P|..
        0x0030:  507c b62e 776f 726c 640d 0a              P|..world..

18:18:49.345417 IP 10.210.214.51.8000 > 10.210.214.51.54042: . ack 14 win 1024 <nop,nop,timestamp 1350350383 1350350382>
        0x0000:  4500 0034 0600 4000 4006 72b9 0ad2 d633  E..4..@.@.r....3
        0x0010:  0ad2 d633 1f40 d31a 0fde a75a 1071 3450  ...3.@.....Z.q4P
        0x0020:  8010 0400 c231 0000 0101 080a 507c b62f  .....1......P|./
        0x0030:  507c b62e                                P|..

18:18:49.345483 IP 10.210.214.51.8000 > 10.210.214.51.54042: P 1:13(12) ack 14 win 1024 <nop,nop,timestamp 1350350383 1350350382>
        0x0000:  4500 0040 0601 4000 4006 72ac 0ad2 d633  E..@..@.@.r....3
        0x0010:  0ad2 d633 1f40 d31a 0fde a75a 1071 3450  ...3.@.....Z.q4P
        0x0020:  8018 0400 c23d 0000 0101 080a 507c b62f  .....=......P|./
        0x0030:  507c b62e 6161 6161 6161 6161 6161 0d0a  P|..aaaaaaaaaa..

18:18:49.345586 IP 10.210.214.51.54042 > 10.210.214.51.8000: . ack 13 win 1025 <nop,nop,timestamp 1350350383 1350350383>
        0x0000:  4500 0034 96eb 4000 4006 e1cd 0ad2 d633  E..4..@.@......3
        0x0010:  0ad2 d633 d31a 1f40 1071 3450 0fde a766  ...3...@.q4P...f
        0x0020:  8010 0401 c231 0000 0101 080a 507c b62f  .....1......P|./
        0x0030:  507c b62f                                P|./


这里没有出现延迟


第二次就出现了延迟
18:18:49.345784 IP 10.210.214.51.54042 > 10.210.214.51.8000: P 14:20(6) ack 13 win 1025 <nop,nop,timestamp 1350350383 1350350383>
        0x0000:  4500 003a 96ec 4000 4006 e1c6 0ad2 d633  E..:..@.@......3
        0x0010:  0ad2 d633 d31a 1f40 1071 3450 0fde a766  ...3...@.q4P...f
        0x0020:  8018 0401 c237 0000 0101 080a 507c b62f  .....7......P|./
        0x0030:  507c b62f 6865 6c6c 6f20                 P|./hello.


18:18:49.385257 IP 10.210.214.51.8000 > 10.210.214.51.54042: . ack 20 win 1024 <nop,nop,timestamp 1350350423 1350350383>
        0x0000:  4500 0034 0602 4000 4006 72b7 0ad2 d633  E..4..@.@.r....3
        0x0010:  0ad2 d633 1f40 d31a 0fde a766 1071 3456  ...3.@.....f.q4V
        0x0020:  8010 0400 c231 0000 0101 080a 507c b657  .....1......P|.W
        0x0030:  507c b62f                                P|./


18:18:49.385367 IP 10.210.214.51.54042 > 10.210.214.51.8000: P 20:27(7) ack 13 win 1025 <nop,nop,timestamp 1350350423 1350350423>
        0x0000:  4500 003b 96ed 4000 4006 e1c4 0ad2 d633  E..;..@.@......3
        0x0010:  0ad2 d633 d31a 1f40 1071 3456 0fde a766  ...3...@.q4V...f
        0x0020:  8018 0401 c238 0000 0101 080a 507c b657  .....8......P|.W
        0x0030:  507c b657 776f 726c 640d 0a              P|.Wworld..


18:18:49.385380 IP 10.210.214.51.8000 > 10.210.214.51.54042: . ack 27 win 1024 <nop,nop,timestamp 1350350423 1350350423>
        0x0000:  4500 0034 0603 4000 4006 72b6 0ad2 d633  E..4..@.@.r....3
        0x0010:  0ad2 d633 1f40 d31a 0fde a766 1071 345d  ...3.@.....f.q4]
        0x0020:  8010 0400 c231 0000 0101 080a 507c b657  .....1......P|.W
        0x0030:  507c b657                                P|.W


18:18:49.385504 IP 10.210.214.51.8000 > 10.210.214.51.54042: P 13:25(12) ack 27 win 1024 <nop,nop,timestamp 1350350423 1350350423>
        0x0000:  4500 0040 0604 4000 4006 72a9 0ad2 d633  E..@..@.@.r....3
        0x0010:  0ad2 d633 1f40 d31a 0fde a766 1071 345d  ...3.@.....f.q4]
        0x0020:  8018 0400 c23d 0000 0101 080a 507c b657  .....=......P|.W
        0x0030:  507c b657 6161 6161 6161 6161 6161 0d0a  P|.Waaaaaaaaaa..


18:18:49.385968 IP 10.210.214.51.54042 > 10.210.214.51.8000: F 27:27(0) ack 25 win 1025 <nop,nop,timestamp 1350350423 1350350423>
        0x0000:  4500 0034 96ee 4000 4006 e1ca 0ad2 d633  E..4..@.@......3
        0x0010:  0ad2 d633 d31a 1f40 1071 345d 0fde a772  ...3...@.q4]...r
        0x0020:  8011 0401 c231 0000 0101 080a 507c b657  .....1......P|.W
        0x0030:  507c b657                                P|.W


第二次发送的过程
1.客户端 发送 hello --> 服务端  此时立刻发送
2.服务端由于没有处理完逻辑,暂时不发送数据,因此ack就延迟了40毫秒,从tcpdump的时间戳可以看到,超时以后服务端发送ack包
3.客户端将没有发送完的数据发送给服务端
4.服务端收到了数据,发送ack应答
5.服务端处理完逻辑后发送返回的数据
6.客户端对服务端数据做ack应答

从这里可以看到延迟出现在第二次 客户端发送包的时候,尽管上次的java代码已经发送了,但此时数据还在内核中,没有真正的发送,因此 客户端在 read数据的时候会出现一次停顿,这个停顿就是等待服务端返回数据
而服务端又等待客户端内核中的数据, 等到40毫秒超时后,服务端返回了一个ack应答,于是客户端内核将剩余的数据发送,之后就正常了









分享到:
评论

相关推荐

    Lwip之TCP实现.pdf

    - `TCP_NODELAY`: 如果定义,则不延迟发送来合并数据包。 - `TCP_KEEPALIVE`: 定义了keep-alive选项,用于维持空闲连接。 - `TCP_KEEPDEFAULT`: 7200 秒 (2 小时),默认的keep-alive探测发送前的等待时间。 - `...

    TCP 数据粘连分析及解决文档

    - 发送方:使用TCP的`push`操作或设置合适的TCP选项,如TCP_NODELAY,强制立即发送数据,减少数据包的合并。 - 接收方:优化程序设计,确保接收进程能快速处理接收的数据,避免缓冲区堆积。可以使用固定长度或带有...

    高级TCP/IP编程.PDF带源码

    书中的技巧可能包括:正确设置套接字选项,如SO_REUSEADDR和TCP_NODELAY,以优化连接性能;使用非阻塞I/O或多路复用I/O模型(如select、poll、epoll)来提高并发处理能力;以及掌握TCP流量控制和拥塞控制机制,确保...

    tcp/ip详解里sock小程序

    6. **选项设置**:TCP协议允许设置各种选项,如TCP_NODELAY(禁用Nagle算法以减少延迟),sock展示了如何使用setsockopt()和getsockopt()函数来设置和查询这些选项。 7. **多线程编程**:为了同时处理多个连接,...

    nginx_tcp_proxy_module-master

    4. **日志记录**:可以记录TCP连接的相关信息,便于监控和分析。 5. **超时设置**:通过`proxy_timeout`可以设置与后端服务器的连接超时时间。 6. **Proxy Protocol**:如果开启`proxy_protocol`选项,Nginx会传递...

    socket编程实例 TCP通信编程

    10. **套接字选项**:TCP套接字有许多可设置的选项,如SO_RCVBUF和SO_SNDBUF用于设置接收和发送缓冲区大小,TCP_NODELAY禁用Nagle算法以减少延迟。 本实例提供的源代码应该涵盖了服务器端和客户端的实现,包括如何...

    log_tcp_源码

    "log_tcp_源码"这个主题显然涉及到对TCP协议的源代码分析,特别是关于TCP参数的使用以及如何通过TCP发送数据包。 TCP参数在通信过程中扮演着关键角色,它们用于调整连接性能、可靠性以及拥塞控制等方面。以下是一些...

    高级tcp/ip编程

    此外,理解和应用TCP选项,如TCP_NODELAY(禁用Nagle算法)、TCP_KEEPALIVE(维持连接活性)等,也是提高网络通信效率和稳定性的重要手段。 在网络层,IP协议处理数据包的路由和分片,而ICMP(Internet Control ...

    有关TCP协议的网络编程

    通过设置TCP选项(如TCP_NODELAY)可以调整Nagle算法,优化小数据包的发送效率。 3. **可靠性**:TCP通过序列号、确认应答、重传机制确保数据的可靠性。如果数据包未收到确认,TCP会自动重发,直到接收到确认或达到...

    TCPDemo.zip

    在IT行业中,网络通信是软件开发中的重要组成...通过分析和学习TCPDemo的代码,我们可以更深入地理解C#中TCP通信的实现细节,并将其应用于自己的项目中。这不仅有助于提升网络编程技能,还能为解决实际问题提供参考。

    TCP+IP高效编程--改善网络程序的44个技巧.zip

    2. **套接字选项**:理解和正确使用套接字选项如SO_REUSEADDR、SO_LINGER、TCP_NODELAY等,可以改善网络连接的性能和行为。 3. **缓冲区管理**:理解如何合理设置接收和发送缓冲区大小,有助于优化数据传输速度,...

    TCP&IP Sockets in C Practical Guide for Programmers

    8. **高级主题**:可能会涉及TCP选项(如TCP_NODELAY)、套接字选项(如SO_REUSEADDR)、以及SSL/TLS加密通信。 9. **案例分析**:通过实际的服务器和客户端示例,演示如何构建完整的网络应用,如简单的HTTP服务器...

    C# Socket TCP和UDP报文及端口测试工具的开发(提供源码)

    6. **套接字选项和属性**:Socket对象有许多可配置的选项和属性,如`NoDelay`(禁用Nagle算法)、`ReceiveBufferSize`和`SendBufferSize`(设置缓冲区大小),可以根据需求调整以优化性能。 7. **异常处理**:在...

    异数OS TCP协议栈性能测试(一)1

    这是因为ACK NoDelay模式下,TCP立即发送确认,减少了等待确认的时间,从而提高了包交换速率。 测试方案三将服务器放在一个CPU核心上,而两个客户端则运行在另一个核心上,采用双核CPU进行双向传输,仍使用ACK ...

    TCP/IP(下)

    setsockopt(m_hSocket, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on)); ``` #### 十二、滑动窗口 - **定义**:一种流控机制,允许发送方在停止等待确认前可连续发送多个分组。 - **工作原理**:根据接收方提供的...

    TCP_and_C.zip

    9. **性能优化**:可能会涉及到TCP选项的设置,如TCP_NODELAY(禁用Nagle算法)以减少小包延迟,或者根据实际需求调整TCP缓冲区大小。 10. **安全性**:虽然这个项目没有明确提到,但实际应用中,传输数据的安全性...

    基于c语言的tcp协议

    通过阅读和分析`client.c`和`server.c`源代码,你可以深入理解TCP连接的建立、维护以及数据传输的细节,这将对你的网络编程技能有极大的提升。同时,这个基础可以作为进一步学习高级网络编程,如HTTPS、WebSocket等...

    Linux或Windows下判断socket连接状态

    2. 分析`tcp_info.tcpi_state`字段,它包含了TCP连接的状态码。 在Windows环境中,虽然没有直接对应的`TCP_INFO`结构体,但我们可以使用`WSAIoctl()`函数配合`SIO_TCP_CONNINFO`控制代码来获取相似信息。这个函数...

    asp.net多线程的TCP端口扫描程序的设计与实现(源代码+论文).zip

    这个程序的主要目标是检测网络上指定主机的开放端口,这在网络安全分析、系统调试和渗透测试中非常常见。 首先,我们需要理解TCP端口扫描的基本原理。TCP(传输控制协议)是互联网协议栈中的关键部分,它为两台...

    带粘包处理的ScktComp Sin Example Rar

    4. **立即发送**:调用TCP的`send`函数时,指定`TCP_NODELAY`选项,禁用Nagle算法,避免数据积压。 在ScktComp Sin Example中,开发者可能演示了如何在C++或其他编程语言中实现这些策略,以解决TCP粘包问题。服务器...

Global site tag (gtag.js) - Google Analytics