3次握手&4次放手


在大学里学习《计算机网络》的课程的时候,非常重要的一个内容就是TCP的3次握手创建连接和4次分手断开连接,先用Wireshark抓包看个实例:

syn_syn-ack_ack

 

一些参考链接:

 

理解了上面的之后,还需要理解一下在TCP传输过程中的seq和ack号代表的意思和作用:

Understanding TCP Sequence and Acknowledgment Numbers – PacketLife.net

 

补充:一些网络流量分析工具/说明

《 “3次握手&4次放手” 》 有 8 条评论

  1. 通俗大白话来理解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

  2. 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

  3. 线上大量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、不论是分析代码还是火焰图,到此应该能够很快定位到问题。
    `

  4. 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一般是由于对端主动关闭,而我方没有正确处理的原因引起的。说白了,就是程序写的有问题,属于危害比较大的一种)。
    `

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注