计算机网络 TCP协议梳理

前言

本文梳理TCP协议
TCP:Transmission Control Protocol ,传输控制协议

TCP的主要特性

  • 面向连接的传输协议
    是指应用程序在使用TCP之前,必须先建立TCP传输连接,在传输数据完毕后,必须释放已建立的TCP传输连接。
  • 仅支持单播传输
    每条TCP传输连接只能有两个端点(socket),只能进行点对点的数据传输,不支持多播和广播的传输方式。
  • 提供可靠的交付服务
    TCP可以无差错、不丢失、不重复,且按时序达到对端。
  • 传输单位为数据段
    TCP仍采用了传统的"数据段"作为数据传输单元。
    数据段指TCP对从应用层接收的数据进行分割所得到的数据块。
  • 仅一种TPDU格式
    因为在TCP数据段头部已包括了各种TPDU所需的特征字段,主要是通过其中的多个控制为来实现的。
  • 支持全双工通信
    TCP连接的两端都设有发送和缓存,用来临时存放双向通信的数据。
  • TCP连接是基于字节流的,而非报文流
    TCP不像UDP那样以一个个报文独立的进行传输,而是在不保留报文边界的情况下以字节流方式进行传输。
  • 每次发送的TCP数据段大小和数据段数都是可变的
    TCP传输的数据段大小是根据对方给出的窗口大小和当前可用的发送窗口(当前网络的拥塞程度)来决定的;同时也受应用层传送的报文大小和所途径网络中MTU值大小决定;
    这样一来每次可以发送的TCP数据段数也是不固定的;可以一次仅发送一个TCP数据段,也可以一次发送多个TCP数据段,只要在当前可用的发送窗口大小限制之内即可。
    另外如果应用进程传送到TCP缓存中的数据太长,TCP可以对它进行分段;反之,如果传到TCP缓存中的数据太小,则TCP会等待缓存中有足够多的数据后再组装成一个数据段一起发送(沾包和拆包)。

TCP报文段

计算机网络 TCP协议梳理_第1张图片

ACK、SYN和FIN这些大写的单词表示标志位,其值要么是1,要么是0;
ack、seq小写的单词表示序号。

  • 源端口和目的端口
    分别代表呼叫方和被叫方的TCP端口号。一个端口与其主机IP地址就可以完整的标识一个端点了,即Socket。
    端口是传输层的概念,源ip和目的ip会在网络层添加到IP首部中。

  • 序列号seq:
    占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。

  • 确认号ack:
    占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;
    序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。

  • 同步SYN:连接建立时用于同步序号。
    当SYN=1,ACK=0时表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使得SYN=1,ACK=1。
    因此,SYN=1表示这是一个连接请求,或连接接受报文。
    SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0。

  • 确认ACK:
    占1位,仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效

  • 终止FIN:
    用来释放一个连接。
    FIN=1表示:此报文段的发送方的数据已经发送完毕,并要求释放运输连接

  • 窗口大小
    指示发送此TCP数据段的主机上用来存储传入数据段的窗口大小,也即发送者当前还可以接收的最大字节数。“窗口大小”字段的值告诉接收本数据段的主机,从本数据段中所设置的“确认号”值算起,本端目前允许对端发送的字节数,是作为让对方设置其发送窗口大小的依据。

为什么TCP是可靠的连接

校验、序号、确认、重传。

  1. 字节编号机制
    TCP数据段是以字节为单位对数据段中的数据部分进行一一编号,确保每个字节的数据都可以有序传送和接收。
    TCP发送的数据段中“数据”部分(不包括TCP数据段头部),每个字节都有一个序号,每个数据段中的“序号”字段是以该数据段中第一个字节的序号进行填充的。

  2. 数据段确认机制
    TCP要求每接收一个数据段都必须由接收端向发送端返回一个确认数据段ACK,其中的确认号表明了接收端已正确接口的数据段序号(确认号前面的所有数据段)。
    ACK是一个表明“确认号”字段是否有效的标志位。只有ACK字段的值为1,数据段中的“确认号”才有意义,否则数据段中的“确认号”没有意义,即不具有上面所说的“确认号”含义。

    • TCP可一次连续发送多个数据段
      TCP不需要等待接收对方发送的确认数据段(“ACK”字段为1的数据段)就可以一次性连续发送多个数据段,这样可大大提高数据发送效率。但一次性可发送多少个数据段是受对方返回的“窗口大小”字段值和当前可用“发送窗口”大小双重限制的。因为发送端对还没有收到确认的数据段要进行缓存,这需要占用一定的“发送窗口”大小。
    • 仅对连续接收的数据

你可能感兴趣的:(计算机网络,操作系统等,TCP,计算机网络)