你需要知道的TCP/IP( 五 )


这里还有个 全连接队列和半链接队列 的知识点

http://mflyyou.cn/2020/07/18/cong-linux-nei-he-li-jie-java-zhong-socket-tong-xin/#toc-heading-5
 
TCP 四次挥手断开连接
你需要知道的TCP/IP

文章插图
 
图片来自 码出高效:Java 开发手册
CLOSE_WAIT 是被动断开连接的一方收到对方 FIN 包之后,回复 ACK 之后进入的状态 。进入 CLOSE_WAIT 之后不会接受数据了,进行已收数据的业务处理之后,在发送一个 ACK+FIN,进入 LASK_ACK,然后等待对方发送 ACK,超时没有等到,会重试发送(内核可以配置重试发送次数) 。当你发现服务端有大量的 CLOSE_WAIT 链接,服务端的代码有问题,需要排查 。
TIME_WAIT 的连接需要等待 2MSL再断开连接 。
TIME_WAIT 的连接多的话,服务端也要优化,不然这个链接会占用很长时间,在高并发的时候,资源连接释放的慢,导致不能分配新的链接 。
MSL 为 Maximum Segment Lifetime,在 centos 中 MSL 默认值为 60s,2MSL=2*60=120s
# sysctl -a | grep tcp_fin_timeout# 推荐小于 30,也不能太小,15-30net.ipv4.tcp_fin_timeout = 60A 机器 TIME_WAIT 链接 会在 120 s 之后才能释放 。这个是为了保证 B 机器 能接收到最后一个来自 A 机器 的ACK 。如果 B 机器 处于 LAST_ACK 状态的连接没有收到 A 机器 发来的 ACK 的话,会重试发送一个 FIN+ACK 。这个 2MSL 也是为了最大限度保证 B 机器正常关闭 。
三次握手 建立连接 和 四次挥手 断开连接需要结合抓包工具自己分析一下,理解会更深刻 。
网络抓包Wireshark 抓包分析是很厉害的,mac os 和 linux 都有命令行程序 tshark,可以在服务器用 tshark 抓包,拿到本地来分析 。
抓包的时候一定要指定抓什么包,什么包都抓的话,一会你的电脑内存就飙升好多(别问我为啥知道,问就是 30g 内存都让它吃了) 。
Wireshark 有个 抓包过滤器 和 显示过滤器 。抓包的时候指定抓什么包这是 抓包过滤器 的作用,抓包之后显示显示那些内容那是 显示过滤器 的作用
# -i 指定那个网卡 # -f 指定抓包过滤器# -Y 显示过滤器# -w 指定抓包数据到文件,没有 -w 输出屏幕# -V 显示 TCP/IP 每层包的详细信息,建议将抓包的文件在图形化界面中查看,不指定 -Vtshark-i en0 -f "tcp" -Y "http"# 抓取访问 www.mflyyou.cn 的包tshark-i en0 -w a.pcap -f "host www.mflyyou.cn"# 指定抓那个协议 tcp,ip,icmp,arp,udptshark-i en0 -f "tcp"# host 指定域名或者 ip# port 指定端口# 访问 www.mflyyou.cn 的包,或者 icmp. ping www.baidu.com 也会被抓到tshark-i en0 -f "host www.mflyyou.cn || icmp"tshark-i en0 -f "port 80"# 条件之间支持逻辑运算符 || && !# 抓取 ssh 链接的包tshark-i en0 -f "host www.mflyyou.cn && port 22"参考资料《图解 TCP/IP》
linux-tcp 说明
【你需要知道的TCP/IP】鸟哥私房菜:基础网络的概念


推荐阅读