在上一篇《TCP的MTU Probe和MSS(1)》介绍了TCP使用MTU Probe来避免PMTU变小而导致发送失败的方法。...这时候就可以做点额外的工作,即进行MTU探测。 接下来进入tcp_mtu_probe,其入口先进行“合法性”检查,判定哪些情况不适合做MTU探测。 ?...如果探测失败,即该TCP报文由于丢失了怎么办? TCP数据包丢失时,会发生什么情况?在处理快速重传的函数tcp_fastretrans_alert中,判定MTU探测失败。 ?...数据包成功的发送到了对端,本端的TCP再次进入MTU探测函数tcp_mtu_probe。 ?...探测报文的发送时间间隔超过配置值,则更新探测上限为可能MTU的最大值(MSS上限+TCP首部+IP报文首部),下限为根据当前MSS计算的MTU值。
在前面两篇文章中,我们研究了在TCP三次握手时MSS选项的值:一般情况下,都是由出口路由的MTU大小决定:MTU-40。...MTU探测的工作函数tcp_mtu_probing是在tcp_write_timeout中调用的。 ?...当TCP重传超过设置的sysctl_tcp_retries1值(/proc/sys/net/ipv4/tcp_retries1)时,就会调用tcp_mtu_probing。...接下来,我们来看tcp_mtu_probing的代码。 ? 在这份代码中,MTU的下线探测还是比较激进的。...但内核才不会做这种傻事呢,下一篇将分析MTU Probe如何处理MTU增大的情况 (未完待续。。。。。。) 专注于Linux网络开发,每两周一更
时间都是花在在丢包重传等待的过程 奇怪的问题是图中橙色框中看到的,网络这时候是联通的,客户端跟服务端在这个会话中依然有些包能顺利到达(Keep-Alive包) 同时注意到重传的包长是1442,包比较大了,看了一下tcp...packet: 1428 > 1400 结论 到这里问题已经很明确了 openvswitch 收到了 一个1428大小的包因为比mtu1400要大,所以扔掉了,接着查看宿主机1的网卡mtu设置果然是1400...,悲催,马上修改mtu到1500,问题解决。...最后的总结 因为这是客户给的同一批宿主机默认想当然的认为他们的配置到一样,尤其是mtu这种值,只要不是故意捣乱就不应该乱修改才对,我只检查了两个容器的mtu,没看宿主机的mtu,导致诊断中走了一些弯路...常见问题 Q: 传输的包超过MTU后表现出来的症状?
windows通过命令获取mtu 一、支持>2008R2的系统,不支持≤2008R2 #快 $NICName=(Get-WmiObject Win32_NetworkAdapter -Filter '...NetEnabled=True').NetConnectionID Get-NetAdapter $NICName| Format-List *|findstr /i mtu #快 $NICName=...ipv4 show subinterface $NICName| Select-Object -Index 3).substring(0,14)).Trim(" `t`n`r") windows通过命令修改mtu...: https://cloud.google.com/vpc/docs/change-mtu-vpc-network?
什么是MTU Maximum Transmission Unit,缩写MTU,中文名是:最大传输单元。 这是哪一层网络的概念? 从下面这个表格中可以看到,在7层网络协议中,MTU是数据链路层的概念。...MTU限制的是数据链路层的payload,也就是上层协议的大小,例如IP,ICMP等。...OSI中的层 功能 TCP/IP协议族 应用层 文件传输,电子邮件,文件服务,虚拟终端 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 表示层 数据格式化,代码转换,数据加密 没有协议...会话层 解除或建立与别的接点的联系 没有协议 传输层 提供端对端的接口 TCP,UDP 网络层 为数据包选择路由 IP,ICMP,RIP,OSPF,BGP,IGMP 数据链路层 传输有地址的帧以及错误检测功能...SLIP,CSLIP,PPP,ARP,RARP,MTU 物理层 以二进制数据形式在物理媒体上传输数据 ISO2110,IEEE802,IEEE802.2 MTU有什么用?
MTU: Maximum Transmit Unit,最大传输单元,即物理接口(数据链路层)提供给其上层(通常是IP层)最大一次传输数据的大小;以普遍使用的以太网接口为例,缺省MTU=1500 Byte...MSS:Maximum Segment Size ,TCP提交给IP层最大分段大小,不包含TCP Header和 TCP Option,只包含TCP Payload ,MSS是TCP用来限制application...如果底层物理接口MTU= 1500 byte,则 MSS = 1500- 20(IP Header) -20 (TCP Header) = 1460 byte,如果application 有2000 byte...发送,需要两个segment才可以完成发送,第一个TCP segment = 1460,第二个TCP segment = 540。...tcp 通讯 MSS 确定 如上图 端口53842 为 A; 端口 80 为 B。
1、Ethernet II 中Ethernet帧最大1518,除去18(6DA+6SA+2EtherType+4CRC),MTU为1500。...2、802.3ac增加了对vlan的支持,在有vlan时在SA后增加4个字节,最大帧就成了原来的1518+4=1522,MTU仍为1500。...这样PPP协议就会占用8个字节,于是就有了很多SOHO路由器在PPPoE拨号时MTU只能填成最大1492(1500-8)了。 4、那么1460是怎么来的呢?...一般1460是指默认的TCP MSS,即TCP数据包单包最大携带数据量。该1460=1500-20-20. 其中的第一个20是IP报头,第二个是TCP报头。 收藏于 2012-08-10
TCP/IP协议 TCP/IP 协议栈是一系列网络协议(protocol)的总和,是构成网络通信的核心骨架,它定义了电子设备如何连入因特网,以及数据如何在它们之间进行传输。...OSI 7层模型和TCP/IP四层网络模型对应关系 计算机网路基础的知识不过多讲解,主要是让大家明白接下来的Linux网络编程数据流属于那一层,具体如下图 TCP/IP协议数据流示意图 我们接下来讲解的...Linux网络编程Tcp协议是属于传输层的协议 Linux Socket 网络编程 TCP协议 TCP是面向连接的可靠的传输层协议。...TCP编程 Linux中的网络编程是通过socket接口来进行的。socket是一种特殊的I/O接口,它也是一种文件描述符。常用于不同机器上的进程之间的通信,当然也可以实现本地机器上的进程之间通信。...使用TCP协议的流程图 根据流程图逐一讲解API接口.
all:server_tcp client_tcp server_tcp:UdpServerMain.cc g++ -o $@ $^ -std=c++17 -lpthread client_tcp...函数原型(C/C++) 在 POSIX 系统(如 Linux)中,listen 函数的原型如下: int listen(int sockfd, int backlog); 在 Windows 系统中,listen...函数原型(C/C++) 在 POSIX 系统(如 Linux)中,accept 函数的原型如下: int accept(int sockfd, struct sockaddr *addr, socklen_t...EchoServer -- 线程池 引入我们之前写的【Linux】:线程库 Thread.hpp 简单封装 Thread.hpp 以及 单例模式下的【Linux】:日志策略 + 线程池(单例模式 Threadpool.hpp...private: std::set _white_list; // 白名单,只让执行一些命令 }; 执行结果如下: 8. windows 作为 client 访问 Linux
wide': 0 tcp:tcp_retransmit_skb...0 tcp:tcp_send_reset 0 tcp:tcp_receive_reset...5 tcp:tcp_rcv_space_adjust...0 tcp:tcp_retransmit_synack 9 tcp:tcp_probe...] [k] tcp_rcv_state_process + 50.00% 0.00% python [kernel.kallsyms] [k] __tcp_transmit_skb
其中复位标志RST的作用就是“复位相应的TCP连接”。 TCP连接和释放时还有许多细节,比如半连接状态、半关闭状态等。详情请参考这方面的巨著《TCP/IP详解》和《UNIX网络编程》。...原因在于Socket.close()方法的语义和TCP的“FIN”标志语义不一样:发送TCP的“FIN”标志表示我不再发送数据了,而Socket.close()表示我不在发送也不接受数据了。...; 客户端和服务器统一使用TCP短连接。...然后是客户端和服务器统一使用TCP长连接:客户端使用TCP长连接很容易配置(直接设置HttpClient就好),而服务器配置长连接就比较麻烦了,就拿tomcat来说,需要设置tomcat的maxKeepAliveRequests...,固定5分钟tcp连接回收,而且发现连接出错时,重发之前10s内消息。
引言 TCP协议是传输层中非常重要的协议。本篇博客我们将从TCP头部信息、TCP状态转移、TCP数据流、TCP数据流的控制等等方面来讨论! 在TCP协议中,通信双方的地位是平等的。...1、TCP协议的特点 传输层中我们常用的协议有两个:TCP协议和UDP协议。TCP协议相对于UDP协议的特点是:面向连接、可靠的、面向字节流的。...当TCP模块真正开始发送数据时,发送缓冲区中这些等待发送的数据可能被封装成一个或者多个TCP报文发出去,因此,TCP模块发送出的TCP报文段的个数和应用程序执行的写操作次数没有固定的数量关系。...当接收缓冲区收到一个或者多个TCP报文后,TCP模块将它们携带的应用程序的数据按照TCP报文的序号【见下文】依次放入TCP接收缓冲区中,并通知应用程序读取数据。...Linux中(BSD Unix和Windows也是如此), 超时以500ms为一个单位进行控制, 每次判定超时重发的超时 时间都是500ms的整数倍.
TCP socket API 详解 下面介绍程序中用到的 socket API,这些函数都在 sys/socket.h 中。...应用程序可以像读写文件一样用 read/write 在网络上收发数据; 返回值:如果 socket()调用出错则返回-1; 参数:对于 IPv4, family 参数指定为 AF_INET; 对于 TCP...Echo Server 有了上面的接口,我们就可以实现以TCP为基础的简单消息回显服务器了,运行结果应该如下图所示: 代码如下: TCP服务器 #pragma once #include <iostream...port(port), _listensockfd(-1), _isruning(false) { } void InitServer() { // 1.创建Tcp..."; } } ::close(sockfd); return 0; } 与UDP客户端相比,TCP客户端需要与服务器通过connet连接后才能通信。
Docker Daemon生产环境配置提到了MTU设置,但是这只是针对于名为bridge的docker bridge network,对于overlay network是无效的。...如果docker host machine的网卡MTU为1500,则不需要此步骤 设置ingress和docker_gwbridge的MTU 以下步骤得在swarm init或join之前做 假设你有三个机器...] 启动docker sudo systemctl start docker.service 7) [manager] 重建docker_gwbridge, 记得设置之前得到的Subnet参数和正确的MTU...: 1450 不过这样不好,因为这样就把docker compose file的内容和生产环境绑定了,换了个环境这个MTU值未必合适。...参考资料 Use overlay networks Docker MTU issues and solutions docker network create
TCP TCP 全称为 “传输控制协议(Transmission Control Protocol”)....16位窗口大小: 首先要清楚,客户端和服务器基于TCP协议进行通信的时候,互发消息的时候,发送的可是完整的TCP报文,一定要携带完整报头。...Linux 中(BSD Unix 和 Windows 也是如此), 超时以 500ms 为一个单位进行控制, 每次判定超时重发的超时时间都是 500ms 的整数倍....(是发送缓冲区的一部分) 已发送已确认的这个范围是可以被覆盖的,表示无效数据,也就相当于从TCP缓冲区当中移除了。 正是因为又滑动窗口的存在,所以才可以一次发送大量TCP报文。...即使没有写入操作, TCP 自己也内置了一个保活定时器, 会定期询问对方是否还在. 如果对方不在, 也会把连接释放. TCP 小结 为什么 TCP 这么复杂?
TCP 协议段格式 理解TCP的报头: Linux 内核是C语言写的,在 UDP 说过报头是协议的表现,而协议本质就是结构体数据。所有 tcp报头 就是一个结构化或位段。...每行4个字节,总共5行,因此标准 TCP 报文的长度是20字节,选项部分暂不考虑 TCP 报文标准长度:标准 TCP 报文长度是20字节 如何封装解包,如何分用?...Linux 中 ( BSD Unix 和 Windows 也是如此), 超时以 500ms 为一个单位进行控制, 每次判定超时重发的超时时间都是 500ms 的整数倍....由于双方都使用 TCP 协议,所以 TCP 的双方地位是对等的。要了解 TCP,只需要搞清楚一个方向的通信过程,反过来,另一个方向的通信也是一样的。...参数控制,这与客户端重发 FIN 报文的重传次数控制方式是一样的 ④ 第四次挥手失败,发生如下: 在 Linux 系统中,TIME_WAIT状态会持续 2MSL 后才会进入关闭状态 3.
第24章 TCP的未来和性能 24.2 路径MTU发现 在2 . 9节我们描述了路径M T U的概念。这是当前在两个主机之间的路径上任何网络上的最小M T U。...在本书的多种系统(参看序言)中只有Solaris 2.x支持路径MTU发现。
最大传输单元(Maximum transmission unit),以太网MTU为1500。 一、不同网络MTU如下: ? 如果最大报文数据大小(MSS)超过MTU,则会引起分片操作。...二、路径MTU: 网路中主机之间的MTU不是一个常数,取决于所选择的路由,而且路径不一定对称(A到B的选路,B到A的选路)。ICMP MTU发现方法。...MSS:标识TCP传往另一段的最大数据长度,建立连接时,双发通告自己允许的MSS(只能出现在SYN报文中)。...因为每一次发送报文都会包含IP及TCP首部,所以,发送的报文段越大,效率越高,但是以不发生报文分段及双方都接受为基础。否则以较小的MTU发送。...本地连接:通常根据标准,MSS=MTU-IP首部-TCP首部。 非本地连接:MSS默认为536加上20IP首部及20TCP首部,IP数据报默认大小为576。 如下图: ?
那么今天我们就开始另外一个套接字,TCP的使用吧! 值得一提的是,二者的使用其实有很大的相似程度,我们本篇文章主要还是通过创建一个简单的TcpServer为主。...=std::make_unique(); tcp_ptr->InitServer(); tcp_ptr->Start(); return 0; } 可以看见我们这里是没有定义一个默认的...那么我们的TCP他所做的初始化工作又是什么呢? 获取套接字 自然也是要先获取套接字也就是文件描述符信息。...但是我们都知道,TCP是一种面向连接 的协议,这意味着在数据传输之前,通信双方必须 先建立逻辑连接,并在传输结束后 释放连接。...=std::make_unique(); tcp_ptr->InitClient(); tcp_ptr->Start(); return 0; } 进程阻塞的问题
netstat -nat|grep -i "80"|wc -l 查看80的 统计httpd协议的连接数 ps -ef |grep httpd|wc -l 统计状...