阅读本文需要的预备知识: 了解 TCP 协议的状态变迁; 了解 TCP 拆链的四次挥手过程; 了解为什么需要 TIME_WAIT 状态。...这段文字说明了 TIME_WAIT 状态持续 2MSL 的时间可以让一个 TCP 连接的两端发出的报文都从网络中消失,从而保证下一个使用了相同四元组的 TCP 连接不会被上一个连接的报文所干扰。...如何理解 TIME_WAIT 状态持续 2MSL 的时间就可以让一个 TCP连 接的两端发出的报文都从网络中消失呢?...不处理这些报文可能导致前后两个使用相同四元组的连接中的后一个连接出现异常(详见《UNIX网络编程》卷 1 的 2.7 节 第三版); 处于 TIME_WAIT 状态的一端在收到重传的 FIN 时会重新计时(rfc793以及 Linux...Kernel 源代码tcp_timewait_state_process函数)。
阅读本文需要的预备知识: 了解TCP协议的状态变迁; 了解TCP拆链的四次挥手过程; 了解为什么需要TIME_WAIT状态。...这段文字说明了TIME_WAIT状态持续2MSL的时间可以让一个TCP连接的两端发出的报文都从网络中消失,从而保证下一个使用了相同四元组的tcp连接不会被上一个连接的报文所干扰。...如何理解TIME_WAIT状态持续2MSL的时间就可以让一个TCP连接的两端发出的报文都从网络中消失呢?...不处理这些报文可能导致前后两个使用相同四元组的连接中的后一个连接出现异常(详见UNIX网络编程卷1的2.7节 第三版); 处于TIME_WAIT状态的一端在收到重传的FIN时会重新计时(rfc793 以及 linux...kernel源代码tcp_timewait_state_process函数)。
而2MSL的意思就是2倍的MSL的意思。 ? ? ? ? ? ?...服务器无法判断客户端是否收到,这种情况本身就是一种不可靠的情况,堂堂号称可靠的TCP的连接出现这种情况岂不是要被笑掉大牙? ? 乔戈里:小萌你说得很好,也因此出现了客户端要等待2MSL的情况。...但是还是有特殊情况出现:假设新连接和已经关闭的老连接端口号是一样的,如果前一次连接的某些数据仍然滞留在网络中,这些延迟数据在建立新连接之后才到达Server,由于新连接和老连接的端口号是一样的,于是,TCP...所以TCP连接还要在TIME_WAIT状态等待2倍MSL,这样可以保证本次连接的所有数据都从网络中消失。 ? ?...这个时候小明以为他的消息会在这2MSL中的时间中消失(小明以为这个TCP是正常的四次挥手),悄悄说了一句女神的坏话,但是悲剧的是这个小明所在的网络环境不是可靠的没有等待2MSL的网络环境,并没有消失,因此如果没有
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内消息。
Linux中(BSD Unix和Windows也是如此), 超时以500ms为一个单位进行控制, 每次判定超时重发的超时 时间都是500ms的整数倍....首先说什么是MSL,TTL,以及两者的关系 MSL就是最大的报文生成时间,MSL是网络报文生存的最长时间,超过这个时间,报文将会被丢弃,因为TCP是基于IP协议的,TTL是经过路由器的最大跳数,每经过一个路由器...TTL 与 MSL的区别 : TTL是经过路由的最大跳数,MSL是报文生存的最长时间,要确保MSL>=TTL才能保证报文是正常消亡. 为什么要等待2MSL呢 ?...这样报文一来一回的时间就是2MSL....2MSL.
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连接后才能通信。
湿度敏感性等级:MSL,Moisture sensitivity level 之所以有这个等级,大概是因为以下原因: 目的在于确定那些由湿气所诱发应力敏感的非密封固态表面贴装元器件的分类, 以便对其进行正确的封装...下图是IPCJEDEC J-STD-020D.1 对湿敏等级的划分: 分别是:MSL 1、MSL 2、MSL 2a、MSL3、MSL4、MSL5、MSL5a、MSL6,从下图中可看出,等级数字越大,越容易吸湿...对烘烤条件的规定: 针对零件生产厂商,经销商出零件的烘烤条件规定: 针对用户端使用零件的烘烤条件规定: 好了,以上就是今天要分享的内容,看完后每位工程师可以自检下是否有此流程,最好建立个元器件MSL
Linux 中(BSD Unix 和 Windows 也是如此), 超时以 500ms 为一个单位进行控制, 每次判定超时重发的超时时间都是 500ms 的整数倍....TCP 协议规定,主动关闭连接的一方要处于 TIME_ WAIT 状态,等待两个MSL(maximum segment lifetime)的时间后才能回到 CLOSED 状态....我们使用 Ctrl-C 终止了 server, 所以 server 是主动关闭连接的一方, 在TIME_WAIT 期间仍然不能再次监听同样的 server 端口; MSL 在 RFC1122 中规定为两分钟...,但是各操作系统的实现不同, Centos7 上默认配置的值是 60s; 可以通过 cat /proc/sys/net/ipv4/tcp_fin_timeout 查看 msl 的值; 那么为什么要进入这个状态呢...即使没有写入操作, TCP 自己也内置了一个保活定时器, 会定期询问对方是否还在. 如果对方不在, 也会把连接释放. TCP 小结 为什么 TCP 这么复杂?
TCP 协议段格式 理解TCP的报头: Linux 内核是C语言写的,在 UDP 说过报头是协议的表现,而协议本质就是结构体数据。所有 tcp报头 就是一个结构化或位段。...,才有 TIME_WAIT 状态 2.2 特殊状态 我们先来看看一些前置知识 – MSL,来方便对其的理解 MSL(Maximum Segment Lifetime) 定义:MSL 是 TCP 报文段在网络中能够存活的最长时间...作用: 确保网络中旧的、重复的 TCP 报文段不会干扰新的连接。 在 TCP 连接关闭时,MSL 用于确定 TIME_WAIT 状态的持续时间。...MSL 是 TCP 报文的最大生存时间, 因此 TIME_WAIT 持续存在 2MSL 的话。...参数控制,这与客户端重发 FIN 报文的重传次数控制方式是一样的 ④ 第四次挥手失败,发生如下: 在 Linux 系统中,TIME_WAIT状态会持续 2MSL 后才会进入关闭状态 3.
为避免上面情况, TCP 会等待 2 MSL 时间,让 S 发的 FIN K 和 C 回复的 ACK K+1 在网络上消失,才真正清除掉连接。 为什么等待 2 MSL 时间?...MSL是 Maximum Segment Lifetime的英文缩写,可译为“最长报文段寿命”,是 TCP 协议规定报文段在网络中最长生存时间,超出后报文段就会被丢弃。...RFC793 定义 MSL 为 2 分钟,一般 Linux 会默认设置个更小的值 30 秒。...这块代码是 Linux tcp_timewait_state_process 函数处理的。 而 2 MSL 是为了确保 C 和 S 两端发送的数据都在网络中消失,不会影响后续的新连接,该如何理解?...复用 TIME_WAIT 连接 tcp_tw_reuse = 1: 1 表示开启复用 TIME_WAIT 状态的连接,这个参数在 Linux tcp_twsk_unique 函数中读取的。
因为TCP连接是双向的,所以在关闭连接的时候,两个方向各自都需要关闭。先发FIN包的一方执行的是主动关闭; 后发FIN包的一方执行的是被动关闭。...主动关闭的一方会进入TIME_WAIT状态,并且在此状态停留两倍的MSL时长。 什么是MSL? MSL指的是报文段的最大生存时间,如果报文段在网络活动了MSL时间,还没有被接收,那么会被丢弃。...关于MSL的大小,RFC 793协议中给出的建议是两分钟,不过实际上不同的操作系统可能有不同的设置, 以Linux为例,通常是半分钟,两倍的MSL就是一分钟,也就是60秒,并且这个数值是硬编码在内核中的..., 也就是说除非你重新编译内核,否则没法修改它: #define TCP_TIMEWAIT_LEN (60*HZ) linux系统下怎样修改TIME_WAIT时间?...允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭; net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets
那么今天我们就开始另外一个套接字,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; } 进程阻塞的问题
在Linux系统中,默认的2MSL时间是60秒,即一个MSL为30秒。Linux系统停留在TIME_WAIT状态的时间是固定的60秒。...在Linux内核代码中,它的定义名为TCP_TIMEWAIT_LEN:#define TCP_TIMEWAIT_LEN (60*HZ) /* how long to wait to destroy TIME-WAIT...state, about 60 seconds */如果要修改TIME_WAIT的时间长度,只能修改Linux内核代码中TCP_TIMEWAIT_LEN...的值,并重新编译Linux内核。...为了解决这个问题,TCP设计了一个机制,即经过2MSL的时间,足够让连接中的两个方向上的数据包都被丢弃。
MSL是报文在网络中存在的最长时间,超过该时间就会被丢弃。 为什么TIME_WAIT需要经历2MSL后才可以变为CLOSED?...2MSL的时间是从客户端接收到FIN报文并且发送ACK报文时开始的。如果此时ACK报文没有被服务端接收到触发了服务端的超时重传,客户端又再次收到了FIN报文,那么2MSL将重新开始计时。...LINUX中默认一个MSL是30s,也就是说TIME_WAIT的时间是60s。...=75 # 如果9次探测无响应,则认为对端不可答,中断本次连接 net.ipv4.tcp_keepalive_probes=9 上述三个都是Linux中的默认值,也就是说Linux操作系统中至少经过...以前代表SYN队列大小,但是在Linux 2.2以后就是全连接队列的大小(accept队列的大小)。
netstat -nat|grep -i "80"|wc -l 查看80的 统计httpd协议的连接数 ps -ef |grep httpd|wc -l 统计状...
一、TCP实现回显服务器 1、服务端 (一)TcpServer.hpp #include #include #include #include...defaultip) : listensock_(defaultfd), port_(port), ip_(ip) {} void InitServer() { //IPv4协议,TCP...UsageError); } uint16_t port = std::stoi(argv[1]); //智能指针维护服务器 std::unique_ptr tcp_svr...(new TcpServer(port)); tcp_svr->InitServer(); tcp_svr->Start(); return 0; } 2、客户端 TcpClient.cpp...exit(1); } std::string serverip = argv[1]; uint16_t serverport = std::stoi(argv[2]); //创建TCP
linux TIME_WAIT 相关参数: net.ipv4.tcp_tw_reuse = 0 表示开启重用。...2MSL 的值,linux 需要修改内核宏定义重新编译,tcp_fin_timeout 不是2MSL 而是Fin-WAIT-2状态超时时间. - tcp_tw_reuse 和 SO_REUSEADDR...MSL 由来 发起连接关闭方回复最后一个fin 的ack,为避免对方ack 收不到、重发的或还在中间路由上的fin 把新连接给丢掉了,等个2MSL(linux 默认2min)。 ...2. reuse、recycle 通过timestamp的递增性来区分是否新连接,新连接的timestamp更大,那么保证小的timestamp的 fin 不会fin掉新连接,不用等2MSL。...参考: Coping with the TCP TIME-WAITstate on busy Linux servers tcp短连接TIME_WAIT问题解决方法大全(3)——tcp_tw_recycle