zoukankan      html  css  js  c++  java
  • TCP详解

    TCP:Transmission Control Protocol -> 传输控制协议,顾名思义,就是对数据的传输进行一定的控制。

    tcp的报头如下所示:

     

     每部分的含义如下:

    16位源端口号:数据从哪个进程来

    16位目标端口号:数据到哪个进程去

    32位序列号:传输数据时,需要携带的标识

    32位确认序号:传输数据时,需要携带的确认标识

    4位首部长度:该tcp报头有多少个 4字节

    6位保留:保留使用

    URG:标识紧急指针是否有效

    ACK:标识确认序号是否有效

    PSH:用来提示接收端应用程序立刻将数据从tcp缓冲区读走

    RST:要求重新建立连接 -> 我们把含有RST标识的报文称为复位报文段

    SYN:请求建立连接 -> 我们把含有SYN标识的报文称为同步报文段

    FIN:通知对端,本端即将关闭 -> 我们把含有FIN标识的报文称为结束报文段

    16位窗口大小:

    16位检验和:由发送端填充,检验形式有CRC校验等. 如果接收端校验不通过, 则认为数据有问题. 此处的校验和不光包含TCP首部, 也包含TCP数据部分。

    16位紧急指针:用来标识哪部分数据是紧急数据

    选项:

    数据:

    tcp三次握手:

    第一次握手:

    客户端主动请求连接,将标志位SYN置为1,并随机产生一个序列号J,然后将这个数据包发送给服务器,进入SYN_SENT的状态,等待服务器的确认。

    第二次握手:

    服务器收到客户端的数据包后,解包发现SYN1,知道客户端要请求连接,然后服务器也需要向客户端请求连接,并确认客户端发的连接请求,即将SYN置为1,并随机产生一个序列号K,将ACK置为1ack置为J+1,然后将这个数据包发送给客户端,随即进入SYN_RCVD状态。

    第三次握手:

    客户端收到服务器的数据包后,解包发现SYN1ACK1ackJ+1,知道服务器已经收到自己的请求连接数据包,并且同意连接,然后客户端向需要服务器发送确认信息,即将ACK置为1ack置为K+1,然后将数据包发送给服务器,随即进入ESTABLISHED状态。

    当服务器收到客户端对自己发送数据包的确认时,也进入ESTABLISHED状态。

    tcp四次挥手:

     

    由于tcp的连接是全双工的,因此每一个方向都需要进行单独的关闭。

    第一次挥手:

    客户端将FIN置为1,其序列号M(等于前面已经传输过来的数据的最后一个字节的序号+1),将这个数据包发送给服务器,然后进入FIN_WAIT_1状态。

    第二次挥手:

    服务器收到结束报文段后,需要发出确认数据包,即将ACK置为1ack为序列号M+1,然后进入CLOSE_WAIT状态。

    第三次挥手:

    服务器将FIN置为1,随机产生一个序列号N,将这个数据包发送给客户端(用来结束服务器向客户端的数据传输),然后进入LAST_ACK状态。

    第四次挥手:

    客户端收到服务器的结束报文后,进入TIME_WAIT状态,并向服务器发送确认报文,将ACK置为1ack置为N+1

  • 相关阅读:
    webpack之模块(七)
    webpack之配置(六)
    webpack之插件(五)
    webpack之loader(四)
    webpack之模式(三)
    webpack之输出(二)
    webpack之入口起点(一)
    Dynamics CRM Tips
    Step by Step 开发dynamics CRM
    Loading Ring 使用文档
  • 原文地址:https://www.cnblogs.com/chen-cai/p/10840659.html
Copyright © 2011-2022 走看看