• TCP详解


    2.1TCP

    由IETF的RFC793定义的传输控制协议(Transmission Control Protocol,TCP)是一种基于字节流的传输层通信协议。在传输数据前需要在发送与接收者之间建立连接,通过相应机制保证其建立连接的可靠性。

    TCP协议具备以下特性:

    • 面向连接协议
    • 多路复用
    • 全双工模式
    • 数据错误校验
    • 数据分段
    • 窗口机制
    • 可靠性机制

    2.1.1 TCP协议的报文

    TCP的报文格式如图2-1所示:

    图2-1 TCP报文格式

     TCP的报文字段解析如下:

    • Source Port:源端口,标识哪个应用程序发送。长度为16比特。
    • Destination Port:目的端口,标识哪个应用程序接收。长度为16比特。
    • Sequence Number:序号字段。TCP链接中传输的数据流每个字节都编上一个序号。序号字段的值指的是本报文段所发送数据的第一个字节的序号。长度为32比特。
    • Acknowledgment Number:确认序列号,是期望收到对方下一个报文段数据的第1个字节的序号,即上次已成功接收到的数据段的最后一个字节数据的序号加1。只有Ack标识为1,此字段有效。长度为32比特。
    • Header Length:头部长度,指出TCP报文头部长度,以32比特(4字节)为计算单位。若无选项内容,则该字段为5,即头部为20字节。
    • Reserved:保留,必须填0。长度为6比特。
    • Control bits:控制位,包含FIN、ACK、SYN等标志位,代表不同状态下的TCP数据段。
    • Window:窗口TCP的流量控制,这个值表明当前接收端可接受的最大的数据总数(以字节为单位)。窗口最大为65535字节。长度为16比特。
    • Checksum:校验字段,是一个强制性的字段,由发端计算和存储,并由收端进行验证。在计算检验和时,要包括TCP头部和TCP数据,同时在TCP报文段的前面加上12字节的伪头部。长度为16比特。
    • Urgent:紧急指针,只有当URG标志置1时紧急指针才有效。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。紧急指针指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)。长度为16比特。
    • Options:选项字段(可选),长度为0-40字节

    在文章最后加作者VX:可以免费领取以下资料

    2.1.2 TCP会话的建立和终止

    1. TCP的建立

    任何基于TCP的应用,在发送数据之前,都需要由TCP进行“三次握手”建立连接。三次握手如图2-2所示:

    图2-2 TCP三次握手

    TCP连接建立的详细过程如下:

    1. 由TCP连接发起方(图中PC1),发送第一个SYN位置1的TCP报文。初始序列号a为一个随机生成的数字,因为没收到过来自PC2的任何报文,所以确认序列号为0 ;
    2. 接收方(图中PC2)接收到合法的SYN报文之后,回复一个SYN和ACK置1的TCP报文。初始序列号b为一个随机生成的数字,同时因为此报文是回复给PC1的报文,所以确认序列号为a+1;
    3. PC1接收到PC2发送的SYN和ACK置位的TCP报文后,回复一个ACK置位的报文,此时序列号为a+1,确认序列号为b+1。PC2收到之后,TCP双向连接建立。

    1. TCP的序列号与确认序列号

    TCP使用序列号和确认序列号字段实现数据的可靠和有序传输,如图2-3所示

                                                          图2-3 TCP的序列号与确认序列号

    假设PC1要给PC2发送一段数据,传输过程如下:

    1. PC1将全部待TCP发送的数据按照字节为单位编上号。假设第一个字节的编号为“a+1”,第二个字节的序号为“a+2”,依次类推。
    2. PC1会把每一段数据的第一个字节的编号作为序列号(Sequence  number),然后将TCP报文发送出去。
    3. PC2在收到PC1发送来的TCP报文后,需要给予确认同时请求下一段数据,如何确定下一段数据呢?序列号( a+1 )+载荷长度=下一段数据的第一个字节的序号(a+1+12)
    4. PC1在收到PC2发送的TCP报文之后,发现确认序列号为“a+1+12” ,说明“a+1”到“a+12”这一段的数据已经被接受,需要从“a+1+12”开始发送。

    在文章最后加作者VX:可以免费领取以下资料

    1. TCP的窗口滑动机制

    TCP通过滑动窗口机制来控制数据的传输速率,如图2-4所示:

                                                          图2-4 TCP窗口滑动机制

    TCP通过滑动窗口机制来控制数据的传输速率流程如下:

      1. 在TCP三次握手建立连接时,双方都会通过Window字段告诉对方本端最大能够接受的字节数(也就是缓冲区大小)。
      2. 连接建立成功之后,发送方会根据接受方宣告的Window大小发送相应字节数的数据。
      3. 接受方接受到数据之后会放在缓冲区内,等待上层应用来取走缓冲的数据。若数据被上层取走,则相应的缓冲空间将被释放。
      4. 接收方根据自身的缓存空间大小通告当前的可以接受的数据大小( Window )。
      5. 发送方根据接收方当前的Window大小发送相应数量的数据。
    1. TCP的关闭

    当数据传输完成,TCP需要通过“四次挥手”机制断开TCP连接,释放系统资源,TCP的四次挥手如图2-5所示:

                                                            图2-5  TCP的四次挥手

    TCP支持全双工模式传输数据,这意味着同一时刻两个方向都可以进行数据的传输。在传输数据之前,TCP通过三次握手建立的实际上是两个方向的连接,因此在传输完毕后,两个方向的连接必须都关闭。流程如下:

    1. 由PC1发出一个FIN字段置”1 ”的不带数据的TCP段;
    2. PC2收到PC1发来的FIN置位的TCP报文后,会回复一个ACK置位的TCP报文。
    3. 若PC2也没有需要发送的数据,则直接发送FIN置位的TCP报文。假设此时PC2还有数据要发送,那么当PC2发送完这些数据之后会发送一个FIN置位的TCP报文去关闭连接。
    4. PC1收到FIN置位的TCP报文,回复ACK报文,TCP双向连接断开。

    在文章最后加作者VX:可以免费领取以下资料

    1. 应用端口

    在描述TCP报文结构的时候,我们提到了源目端口和目的端口;这里所提到的端口是区别于物理端口的一种抽象端口,被称为”应用端口(Application Port)”。应用端口的作用是标识所载荷数据对应了哪个应用层模块。应用端口分为两类:知名端口(范围0-1023)和非知名端口(范围1024-6553);所谓知名端口就是已经分配给一些特定应用层模块,部分TCP知名端口见表2-1

    表2-1 知名TCP端口号示例

    本文出自作者的《HCIA Datacom学习指南》
    https://item.jd.com/14032255.html

    标题

  • 相关阅读:
    定时调用-->笔记
    Vue3踩坑指南
    wsl2 设置端口映射
    NLP模型笔记2022-33:Sentence-BERT STS模型列表与预训练方法
    神经网络训练结果不稳定,神经网络越训练越慢
    POJ 3470 Walls 树上分桶
    pnpm和yarn2 pnp的对比
    Linux运维_Bash脚本_部署安装DocBook-XML-4.5(XML-DTD)
    成电860考研专业课考前划重点-学长课程音频转文字-用科大讯飞花钱买的-三万五千字
    git stash 暂存当前修改
  • 原文地址:https://blog.csdn.net/lwljh134/article/details/138157827