zoukankan      html  css  js  c++  java
  • 计算机网络笔记------TCP传输控制协议(1)

    概述

    TCP提供一种面向连接的、可靠的字节流服务。是面向应用与进程之间的全双工数据流通信,传输过程建立在稳定的网络连接的基础上,使用三次握手的方式建立连接,四次挥手的方式断开连接,同时还具有流量控制的、拥塞控制等特点。其位于层次结构的传输层位置。

    TCP连接结构

    状态变量的初始化

    应用与进程在建立连接时,先是通过“三次握手”建立连接,而这一握手的过程实际是数据报文的传输与应答,而为了维持这一过程就需要诸多的TCP状态变量来描述。

    套接字(Socket)

    传输的双方使用一种名为套接字结构来进行端点之间的逻辑描述,其由端点处的IP地址与端口号来描述,在实际的实现中,这一结构被写到报文段中进行用于建立连接。

    缓存

    当连接建立完成后,端与端之间的通信就可以进行了,在发送与接受的双方都会设置一个缓存区域,用于暂存传输的报文数据,并实现异步的处理与流量控制(可以根据缓存区的情况来控制数据的接受与发送)。

    综上述,一个完整的TCP连接包含了两个通信端,每一个通信端都含有状态变量,套接字与缓存区,而在连接之间是以数据报文的传输来进行数据通信的。

    报文结构

    基于层次模型,TCP的报文数据是要由IP协议进行传输的所以,TCP的报文封装到了IP协议的报文结构中,位于IP报文的数据段中,而TCP报文结构同样分为两段,一个首部段,一个数据段。

    首部结构

    报文的结构以4字节32位进行对齐,前20字节为固定的首部结构。
    在这里插入图片描述
    各个字段的描述:

    1. 源端口,16位(0~65535)发送报文端的端口号。
    2. 目的端口,16位(0~65535)目的端的端口号
    3. 序列号,32位,在数据传输中,由于是分段进行的数据流传输,所以传输的每一个字节会有一个编号用于数据校验与保证可靠传输,这一字段为数据段中第一个字节的编号。
    4. 确认号,32位,用作对另一方发送的tcp报文段的响应。其值是期望收到对方的下一个报文段的数据的第一个字节的序号。
    5. 数据偏移(首部长度),4位(0~15),用于描述TCP报文的首部长度(20字节固定端+可选的选项端)(数据偏移:报文段的数据起始处距离 TCP 报文段的起始处有多远),其中长度单位是32 位字(以 4 字节为计算单位),所以首部的范围为20字节到60字节之间,后面的选项段最大为40字节。
    6. 保留段,6位,暂时未用。
    7. 标志字段URG(紧急),URG=1,表明紧急指针字段有效。说明报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。
    8. 标志字段ACK(确认),只有当 ACK = 1 时确认号字段才有效。当ACK = 0 时,确认号无效。
    9. 标志字段PSH(推送),接收端收到 PSH = 1 的报文段,就尽快地交付接收的应用进程,不再等到整个缓存都填满了后再向上交付。
    10. 标志字段RST(复位),当 RST = 1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。
    11. 标志字段SYN(同步),同步 SYN = 1 表示这是一个连接请求或连接接受报文。
    12. 标志字段FIN(终止),用来释放一个连接。FIN = 1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。
    13. 窗口字段,16位,用来控制对方发送的数据量,单位为字节。
    14. 校验和,16位,奇偶校验,此校验和是对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位字进行计算所得。由发送端计算和存储,并由接收端进行验证。在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部。
    15. 紧急指针,16位,指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)。

    选项结构


    选项的结构是以8位一字节为对齐单位,但是选项的最大长度还要保持在上文所述的40字节,选项分为单字节类型与多字节类型,单字节类型由一个字节组成,说明选项的类型号,多字节类型有三个部分,分别是选项的类型(1字节),长度(1字节),选项值(可能有多个字节)。下面列举常见的几种类型:其中kind为0的时候表示选项表结束。

    1. 类型1是空操作项,一般用于填充对齐。
    2. 类型2最大报文段长度,连接初始化的时候,双方会使用该选项来确定传输中报文的最大长度(Max Segment Size,MSS),一般设置为MTU-40(Maximum Transmission Unit,MTU,最大传输单元,指一种通信协议的某一层上面所能通过的最大数据包大小),40是IP报文与TCP报文的头部大小。选项总长4字节。
    3. 类型3窗口扩大因子,连接的初始化的时候,使用这一选项来进行窗口扩大因子的确认。在实际的数据传输中为了获得更大的吞吐率,窗口会在适时的时候进行扩大,新的窗口值(W)使原有窗口值(w)左移选项中的位数(o)后得到的:W=w<<o(乘以2的o次方)(o的取值最大为14)。选项总长3字节。
    4. 类型4选择性确认,该选项用于在连接初始化时表示是否支持选择性确技术(当出现数据包丢失时,TCP会将最后确认的报文后续的所有报文重发,但是在这些报文中往往有部分已近被接收了,所以通过选择性的告知发送方那些已经接收到了,来提高传输效率,避免重复发送)。选项总长2字节。
    5. 类型5是选择性确认的具体确认选项,该选项中包含了已收到的不连续的数据块,每一块由两个部分组成,分别是数据块最左边的报文序号,和数据块最右边的报文序号,一个序号占4字节,一个数据块占8字节(总体长度还在40字节内)。选项的总长度为8n+2,n为数据块的数量。
    6. 类型8时间戳,分为时间戳字段与回显时间戳字段,每个字段4字节,分别表示发送时的时间戳与接受时的时间戳,在接受方发送应答报文时会把接收时的时间戳发回,由此可以计算通信双方之间的回路时间(Round Trip Time,RTT),选项的总长度为10。

    填充字段

    在报文的头部结尾,为了保持字节的对齐,会在末尾进行字段的填充。这一字段为填充字段。

    数据

    紧跟着报文头部后面的就是数据部分了,这一段就是报文信息的主体部分,相关的数据长度已经在头部中确定好了。

  • 相关阅读:
    Flutter 复制文本到剪切板、从剪切板读取文本【转】
    CSS元素超出部分滚动,并隐藏滚动条【转】
    Flutter解决按钮请求防重复提交【转】
    CSS文字超出宽度自动换行【转】
    flutter 使用 url_launcher 唤起三方应用【转】
    Dart 基本数据类型与类型归属判断【转】
    JS 生成唯一字符串UUID【转】
    gtk+笔记
    Win32 API笔记
    utf-8与utf-16的区别
  • 原文地址:https://www.cnblogs.com/yanzs/p/13788240.html
Copyright © 2011-2022 走看看