zoukankan      html  css  js  c++  java
  • TCP 之 TCP首部

    TCP首部图

    TCP首部说明
    源端口,目的端口

    用于寻找发送端和接收端应用进程。(源IP,源端口,目的IP,目的端口) 四元组确定唯一一个TCP连接;(IP,端口)也称为一个插口(socket);

    序号

    标识从TCP发送端向TCP接收端发送的数据字节流,它标识在当前传输报文段中的第一个数据字节;需要是32比特的无符号数,序号达到2^32-1后又冲0开始;

    当建立一个新连接时,SYN标志设置为1;序号字段包含由这个主机选择的初始序号ISN(Initial Sequence Number);该主机要发送数据的第一个字节序号为这个ISN+1,因为SYN标志消耗了一个序号;

    TCP为应用层提供全双工的服务,这意味着数据在两个方向上独立的进行传输。因此,连接的每一端都必须保持每个方向上的传输数据序号。

    确认序号

    确认序号包含发送确认的一端期望收到的下一个需要。因此,确认序号应当是上次已成功收到的数据字节序号+1;只有ACK标志为1时确认序号字段才有效;

    发送ACK无需任何代价,因为32位的确认序号字段和ACK标志一样,总是TCP首部的一部分,因此,一旦一个TCP连接建立起来,这字段总是被设置的,ACK标志也总是被设置为1;

    TCP可以表述为一个没有选择确认或者否认的滑动窗口协议。TCP缺少选择确认是因为TCP首部中的确认序号标识发送方成功接收的的字节,但还不包含确认序号所指的自己。当前还无法对数据流中选定的部分进行确认;如:1-1024已经收到,下一个接收到报文段中序号从2049-3072,此时收端不能确认这个报文段。它所能做的就是发回一个确认序号为1025的ACK;它也无法对一个报文段进行否认;如:如果收到1025-2048字节的报文段,但是校验和错误,TCP接收端所能做的就是发回一个确认序号为1025的ACK;

    首部长度

    首部长度包含4位,TCP首部选项字段的长度是可变的,首部最大长度为1111*4=60字节;没有选项的情况下,正常的长度是20字节;

    标志位

    URG–紧急指针有效;

    ACK–确认序号有效;

    PSH–接收方应该尽快将这个报文段交给应用层;

    RST–重建连接;

    SYN–同步序号用来发起一个连接

    FIN–发送完成发送任务;

    窗口大小

    TCP的流量控制由连接的每一端通过声明窗口的大小来提供;窗口大小为字节数,起始于确认序号字段指明的值,这个值是接收端正期望接收的字节数;窗口大小是一个16位字段,因而窗口大小最大为65535字节;

    校验和

    校验和覆盖了整个TCP报文段:TCP首部和TCP数据。这是一个强制字段,一定是由发送端计算和存储,由接收端进行验证;

    紧急指针

    紧急指针是一个正的偏移量,和序号字段中的值相加标识紧急数据最后一个字节的序号;紧急指针只有在URG标志位设置为1时才有效;TCP紧急指针是发送端向另一端发送紧急数据的一种方式;

    选项

    最常见的选项字段是最长报文段大小,又称为MSS(Maximum Segment Size);每个连接通常都在通信的第一个报文段中指明这个选项;它指明本端所能接受的最大长度的报文段;

    注:本文大部分内容来自于<TCP/IP详解>;

  • 相关阅读:
    codeblocks多文件联合编译
    C++顶层const和底层const的区别
    keras failed to create cublas handle:CUBLAS_STATUS_ALLOC_FAILED问题
    Notepad++强大的代码补全和代码提示功能的方法
    PEP8编码风格
    在Maven项目中使用easypoi完成Excel文件上传下载
    Restful风格,使用同一地址,访问不同的方法
    注解@NoRepositoryBean的作用
    注解@MappedSuperclass的作用
    Shiro整合Spring以及权限登陆过滤
  • 原文地址:https://www.cnblogs.com/wanpengcoder/p/11749397.html
Copyright © 2011-2022 走看看