在大学里学习《计算机网络》的课程的时候,非常重要的一个内容就是TCP的3次握手创建连接和4次分手断开连接,先用Wireshark抓包看个实例:
一些参考链接:
- The TCP/IP Guide – TCP Connection Establishment Process: The “Three-Way Handshake”
- The TCP/IP Guide – TCP Connection Termination
- TCP 3-Way Handshake (SYN,SYN-ACK,ACK) – InetDaemon’s IT Tutorials
- IBM Knowledge Center – TCP connection flow
- 三次握手和四次放手_BecauseOfPig
- TCP状态转换图–从搭讪到热恋到分手
- http://nmap.org/misc/split-handshake.pdf
- Chapter 18. TCP Connection Establishment and Termination
- TCP Connection Close
理解了上面的之后,还需要理解一下在TCP传输过程中的seq和ack号代表的意思和作用:
Understanding TCP Sequence and Acknowledgment Numbers – PacketLife.net
《 “3次握手&4次放手” 》 有 8 条评论
TCP协议中的三次握手和四次挥手(图解)
http://blog.csdn.net/whuslei/article/details/6667471
简析TCP的三次握手与四次分手
http://www.jellythink.com/archives/705
TCP三次握手四次挥手详解
http://www.cnblogs.com/zmlctt/p/3690998.html
TCP 为什么是三次握手,为什么不是两次或四次?
https://www.zhihu.com/question/24853633
TCP三次握手和四次挥手
http://hackerxu.com/2014/11/16/TCP.html
通俗大白话来理解TCP协议的三次握手和四次分手 #nice
https://github.com/jawil/blog/issues/14
TCP三次握手四次挥手详解
http://www.cnblogs.com/zmlctt/p/3690998.html
简析TCP的三次握手与四次分手 #nice
http://www.jellythink.com/archives/705
TCP 为什么是三次握手,为什么不是两次或四次? #nice
https://www.zhihu.com/question/24853633
TCP的特性 #nice
https://hit-alibaba.github.io/interview/basic/network/TCP.html
TCP三次握手及四次挥手详细图解
https://www.centos.bz/2012/08/tcp-establish-close/
理解TIME_WAIT
http://www.firefoxbug.com/index.php/archives/2795/
TCP/IP TIME_WAIT状态原理
http://elf8848.iteye.com/blog/1739571
What is the cost of many TIME_WAIT on the server side?
https://stackoverflow.com/questions/1803566/what-is-the-cost-of-many-time-wait-on-the-server-side
我自己提炼的关于《HTTP权威指南》每章的知识点总结!
https://github.com/woai30231/http
TCP 的那些事儿(上)
http://coolshell.cn/articles/11564.html
TCP 的那些事儿(下)
http://coolshell.cn/articles/11609.html
TCP网络关闭的状态变换时序图
http://coolshell.cn/articles/1484.html
关于TIME_WAIT状态
http://www.cnblogs.com/scut-fm/p/3560395.html
TIME_WAIT状态的意义
https://m.2cto.com/net/201205/130216.html
TCP/IP TIME_WAIT状态原理
http://elf8848.iteye.com/blog/1739571
TCP/IP状态图的TIME_WAIT作用
https://www.iteblog.com/archives/169.html
TCP/IP中TIME_WAIT状态详解
https://sagittariusyx.github.io/2017/07/03/tcp-ip-time-wait/
TIME_WAIT状态在tcp连接中的含义与作用
https://lzw.me/a/tcp-time-wait.html
`
TIME_WAIT状态存在的理由
1)可靠地实现TCP全双工连接的终止
2)允许老的重复分节在网络中消逝
TIME_WAIT状态主要有两个作用
第一:确保主动发起关闭一方响应最后的一个ACK能够正常送达
第二:网络上仍然有可能有残余的数据包(wandering duplicates,或老的重复数据包),我们也必须能够正常处理。
见图解。
`
高性能网络 | 你所不知道的TIME_WAIT和CLOSE_WAIT
https://mp.weixin.qq.com/s/Jt2ss3SsE_iGJp5oW8QDSw
线上大量CLOSE_WAIT原因排查
https://mp.weixin.qq.com/s/NZqNXdv0esCCUFDYtDy_Hw
`
出现问题后,首先要进行分析推断、然后验证、最后定位修改。根据当时的表现是分别进行了以下猜想。
推断一:
socket 资源被不断打满,并且之前从未出现过,今日突然出现,怀疑是不是请求量太大压垮服务
经过查看实时 qps 后,放弃该想法,虽然量有增加,但依然在服务器承受范围(远远未达到压测的基准值)。
推断二:
两台机器故障是同时发生,重启一台,另外一台也会得到缓解,作为独立部署在两个集群的服务非常诡异
有了上面的的依据,推出的结果是肯定是该服务依赖的底层资源除了问题,要不然不可能独立集群的服务同时出问题。
CLOSED 表示socket连接没被使用。
LISTENING 表示正在监听进入的连接。
SYN_SENT 表示正在试着建立连接。
SYN_RECEIVED 进行连接初始同步。
ESTABLISHED 表示连接已被建立。
CLOSE_WAIT 表示远程计算器关闭连接,正在等待socket连接的关闭。
FIN_WAIT_1 表示socket连接关闭,正在关闭连接。
CLOSING 先关闭本地socket连接,然后关闭远程socket连接,最后等待确认信息。
LAST_ACK 远程计算器关闭后,等待确认信号。
FIN_WAIT_2 socket连接关闭后,等待来自远程计算器的关闭信号。
TIME_WAIT 连接关闭后,等待远程计算器关闭重发。
理一下正确的分析思路:
1、出现问题后,立马应该检查日志,确实日志没有发现问题;
2、监控明确显示了socket不断增长,很明确立马应该使用 netstat 检查情况看看是哪个进程的锅;
3、根据 netstat 的检查,使用 tcpdump 抓包分析一下为什么连接会被动断开(TCP知识非常重要);
4、如果熟悉代码应该直接去检查业务代码,如果不熟悉则可以使用 perf 把代码的调用链路打印出来;
5、不论是分析代码还是火焰图,到此应该能够很快定位到问题。
`
Linux之《荒岛余生》(五)网络篇
https://mp.weixin.qq.com/s/h8t4zUUNTAK4wxF_YMvkMQ
`
# 查看当前系统的连接
# netstat -antp | awk ‘{a[$6]++}END{ for(x in a)print x,a[x]}’
# ss -s
根据TCP/IP介绍,socket大概包含10个连接状态。我们平常工作中遇到的,除了针对SYN的拒绝服务攻击,如果有异常,大概率是TIME_WAIT和CLOSE_WAIT的问题。
TIME_WAIT一般通过优化内核参数能够解决;CLOSE_WAIT一般是由于程序编写不合理造成的,更应该引起开发者注意(CLOSE_WAIT一般是由于对端主动关闭,而我方没有正确处理的原因引起的。说白了,就是程序写的有问题,属于危害比较大的一种)。
`
从tcp原理角度理解Broken pipe和Connection reset by peer的区别
https://paper.tuisec.win/detail/e7f076c72847d5f
http://lovestblog.cn/blog/2014/05/20/tcp-broken-pipe/