• TCP/IP报文分析


    三次握手和四次挥手

    Seq,Ack和Len

     TCP Sequence(seq)和Acknowledgement(ack)序号用来帮助实现顺序的、可靠的TCP传输。TCP Client发送数据报文携带seq序号,表示本次会话(session)发送了多少个字节的数据,seq序号也称为“字节序”。TCP Server发送ACK报文携带ack序号,表示累积收到了ack-1个字节的数据,准备接收下一帧。

    每次会话开始时,seq序号和ack序号均从0开始。

     上图中,TCP Client发送的第一个数据报文携带seq为1,len为669;TCP Server的应答报文ack为670(即ack = seq + len),表示它收到了669(ack -1)个字节的报文,期望收到的下一个数据报文的seq为670。

    从这个图上面看,seq序号并不是从0开始的,而是从1开始的。这是因为SYN报文和FIN报文虽然payload均为0,但是它们均会占据一个字节序(seq),如果不这样设计的话,无从判断ACK报文是否应答的SYN和FIN报文。

     上图为TCP头部帧格式,其中,seq和ack均占据4个字节,取值范围0 ~ 232-1,即0~4294967295。

    Wireshark异常报文分析

    TCP Previous segment not captured

    数据帧丢失,即收到的报文的seq大于上一个收到报文的seq+len。如果是Wireshark抓包,有可能是因为乱序导致,需要仔细甄别是因为乱序还是丢帧。

    TCP Out-Of-Order

    次序颠倒,数据在传输过程中顺序乱了,也就是当前报文的seq小于前一个报文的seq+len。

    TCP Dup ACK xxx#y

    重复应答seq=xxx的表示报文到哪个序号丢失,y表示第几次丢失。
    当报文发生乱序或者丢失时,接收端会收到一些seq比期望值更大的报文。
    每收到一次这种报文就ack一次期望值,用以提醒发送方。

    TCP Retransmission

    超时引发的数据重传。

    TCP Spurious Retransmission

    虚假重传,发送端认为报文已经丢失了,发起重传,尽管此时接收端已经发送了ACK应答报文。

    TCP Fast Retransmission

    快速重传,当发送方接收到3个或以上的[TCP Dup ACK],就意识到之前发的包可能丢了,于是快速重传丢失的数据帧。

    TCP Keep-Alive

    保持连接特性,socket 发起方发包

    TCP Keep-Alive ACK

    保持连接特性,socket 应答方发包

    TCP ZeroWindow

     接收方接收缓冲区(接收窗口)满,停止收包

    TCP Window Full

     发送方发送窗口(在途发送的字节数,即接收方未应答,但是发送方已发送的字节数)满,停止发包

  • 相关阅读:
    English Training Material
    SingleThreadModel is deprecated in Servlet API version 2.4
    What is the difference Apache (Http Server) and Tomcat (Servlet Container)
    Add a stylesheet link programmatically in ASP.NET
    Detail in Response.redirect and Server.transfer in ASP.NET
    @font-face usage
    实习面试总结(只写了昨天腾讯的面试和拿到offer的一个小公司, 有空再把前面的补上吧)
    redis-cli启动问题
    关于结构体内存对齐
    memcpy 和 memmove
  • 原文地址:https://www.cnblogs.com/justin-y-lin/p/15166315.html
Copyright © 2020-2023  润新知