传输层协议简述

165 阅读9分钟

传输层协议简述

本篇主要介绍TCP协议以及UDP协议两种协议的内容以及特性,重点介绍了传输层协议的三次握手、四次挥手,同时介绍一些常见协议和相对应端口。

一、TCP协议的特性

  1. 工作在传输层
  2. 面向连接协议
  3. 全双工协议
  4. 半关闭
  5. 错误检查
  6. 将数据打包成段,排序
  7. 确认机制
  8. 数据恢复,重传
  9. 流量控制,滑动窗口

二、UDP协议的特性

  1. 工作在传输层
  2. 提供不可靠的网络访问
  3. 非面向连接协议
  4. 有限的错误检查
  5. 传输性能高
  6. 无数据恢复特性

三、PID与端口号

PID与端口号:系统每启动一个进程,系统都会分配一个标志给这个程序,也就是PID(系统中的编号)。其次会分配给进程分配一个端口号。PID在不同主机中的编号并不相同。

端口号作用:确定系统中的进程

端口号的分类:

  1. 规定好的,固定的端口号。(比如80端口号为http协议的端口号)
  2. 系统可以随机分配的端口号。(客户端在访问服务端时,系统会自动随机分配一个端口号)
  3. 人类可以自由使用的端口号。(新开发的程序规定的端口号且端口号之前没有被使用过)

四、TCP协议的首部报文

1662446961539.png 1、源端口、目标端口: 算机上的进程要和其他进程通信是要通过计算机端口的,而一个计算机端口某个时刻只能被一个进程占用,所以通过指定源端口和目标端口,就可以知道是哪两个进程需要通信。

计算机的端口个数为2^16个,即 65536 (0-65535)

2、序列号: 表示本报文段所发送数据的第一个字节的编号。在TCP连接中所传送的字节流的每一个字节都会按顺序编号。

由于序列号由32位表示,所以每2^32个字节,就会出现序列号回绕,再次从0开始无限循环。

3、确认号(ask) 表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。

举例:如果主机A需要给主机B发送数据包,主机A发送的确认号为0,那么主机A期望主机B回复数据包时需要发送一个数据包的序号为0+1的数据包。

4、首部长度/数据偏移: 表示TCP报文段的首部长度,共4位,由于TCP首部包含一个长度可变的选项部分,需要指定这个TCP报文段到底有多长。它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。

该字段的单位是32位(即4个字节为计算单位),4位二进制最大表示15,所以数据偏移也就是TCP首部最大60字节

5、控制位: 设备之间进行通讯,建立连接的状态由控制位决定。连接状态通常有三种:请求连接;建立连接;断开连接

  • URG(紧急位):表示本报文段中发送的数据是否包含紧急数据。当URG=1时后面的紧急指针字段(urgent pointer)才会生效。

  • ACK(确认位):表示是否前面确认号字段是否有效。只有当ACK=1时,前面的确认号字段才有效。TCP规定,连接建立后,ACK必须为1,带ACK标志的TCP报文段称为确认报文段

  • PSH(急切位):提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间。如果为1,则表示对方应当立即把数据提交给上层应用,而不是缓存起来,如果应用程序不将接收到的数据读走,就会一直停留在TCP接收缓冲区中

  • RST(重置位):如果收到一个RST=1的报文,说明与主机的连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。或者说明上次发送给主机的数据有问题,主机拒绝响应,带RST标志的TCP报文段称为复位报文段

  • SYN(同步位):在建立连接时使用,用来同步序号。当SYN=1,ACK=0时,表示这是一个请求建立连接的报文段;当SYN=1,ACK=1时,表示对方同意建立连接。SYN=1,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中SYN才置为1, 带SYN标志的TCP报文段称为同步报文段 。

  • FIN(断开位):表示通知对方本端要关闭连接了,标记数据是否发送完毕。如果FIN=1,即告诉对方:“我的数据已经发送完毕,你可以释放连接了。”

  • 校验和:提供额外的可靠性紧急指针:标记紧急数据在数据字段中的位置。

  • 选项部分:其最大长度可根据TCP首部长度进行推算。TCP首部长度用4位表示,选项部分最长为:(2^4-1)*4-20=40字节

五、TCP的连接

5.1、TCP连接(三次握手)

首先,先给大家一张两台PC进行通讯的三次握手内容图进行分析: image.png

为什么要三次握手?

数据要有去有回, PC1发送给PC2报文后,PC2进行回复,PC1还需要对PC2的回复再进行一次回复。

如上图所示,PC1为客户端,PC2为服务端,PC1需要向PC2进行请求建立连接

第一步:PC1会发送一个请求建立连接的报文,这个报文包含以下几个内容:

  1. 报文的序号(Seq=x)
  2. 同步位由于PC1和PC2还没有建立连接,处于请求建立连接的状态,所以同步位SYN=1,确认位ACK=0.

第二步:PC2收到PC1请求建立连接的报文后,同意与PC1建立连接,所以需要回复一个报文给PC1,PC2发送的报文内容有以下几点:

  1. 报文的序号(Seq=y)
  2. Ack确认号为x+1,即PC2需要PC1回复一个报文序号为x+1的报文
  3. 控制位 SYN=1 ACK=1 PC2同意PC1请求建立连接的请求,即确认位为1,同步位为1

第三步:PC1收到PC2的回复报文后

  1. 会发送一个报文序号为x+1的报文,即Seq=x+1
  2. Ack确认号为y+1,即希望PC2下一次回复消息的报文序号为y+1
  3. 最后将ACK=1封装进数据包中,这时候PC1与PC2已经建立连接同步位SYN=0

5.2、TCP断开(四次挥手)

下图为TCP断开连接的图片解析:

src=http___s6.51cto.com_oss_202209_02_83f136a48c48e3c3415559673497327a6738a2.jpg 客户A和服务器B都处于建立连接的状态,此时客户A主动与服务器B发出断开连接的请求: 第一步:客户A会发送一个序号为Seq=u的报文给服务器B,此时控制位中的断开位FIN=1,即请求与服务器B断开连接。(PS:此时客户A处于等待断开连接的状态,服务器B的数据传送未结束)

第二步:服务器B需要先将数据传输全部传输结束才能同意断开连接,服务器B会进行下面两步操作:

2.2 服务器B会回复一个报文序号为v的报文给客户A(Seq=1)

需要客户A能回复一个报文序号为u+1的报文给服务器B(确认号ack-u+1)

此时服务器B与客户A仍处于建立连接的状态所以控制位的确认位ACK=1

2.3 服务器B同意了客户A的断开连接请求:服务器B会回复一个同意断开连接的报文:

服务器B发出的报文的序号为w(Seq=w)

需要客户A回复一个报文序号为u+1的报文给服务器B(Ack=u+1)

此时的控制位中,断开位FIN=1,确认位ACK=1(2个控制位表示同意断开连接)

第三步:客户A接收完服务器传输的数据后,收到了服务器B的同意断开连接请求,这个时候客户A会发送一个确认报文给服务器B:

按照服务器B要求,客户A回复了一个报文序号为u+1的报文给服务器B(Seq=u+1)

控制位中确认位为1(ACK=1)

需要服务器B回复客户A一个报文序号为w+1的报文给客户A(此时客户A与服务器相当于完全断开连接,所以客户A最后发送的报文将会被服务器B拒收,服务器B将不再回复客户A)

六、扩展:有限状态机

1、CLOSED 没有任何连接状态 2、LISTEN 侦听状态,等待来自远方TCP端口的连接请求 (服务开启 http(进程) 80端口在帮进程 看着 有没有人找 http ) 3、SYN-SENT 在发送连接请求后,等待对方确认 4、SYN-RECEIVED 在收到和发送一个连接请求后,等待对方确认 5、ESTABLISHED 代表传输连接建立,双方进入数据传送状态 6、FIN-WAIT-1 主动关闭,主机已发送关闭连接请求,等待对方确认 7、FIN-WAIT-2 主动关闭,主机已收到对方关闭传输连接确认,等待对方发送关闭传输连接请求 8、TIME-WAIT 完成双向传输连接关闭,等待所有分组消失 9、CLOSE-WAIT 被动关闭,收到对方发来的关闭连接请求,并已确认 10、LAST-ACK 被动关闭,等待最后一个关闭传输连接确认,并等待所有分组消失 11、CLOSING 双方同时尝试关闭传输连接,等待对方确认

七、TCP超时重传

异常网络状况下(开始出现超时或丢包),TCP控制数据传输以保证其承诺的可靠服务。

TCP服务必须能够重传超时时间内未收到确认的TCP报文段。为此,TCP模块为每个TCP报文段都维护一 个重传定时器,该定时器在TCP报文段第一次被发送时启动。如果超时时间内未收到接收方的应答, TCP模块将重传TCP报文段并重置定时器。至于下次重传的超时时间如何选择,以及最多执行多少次重 传,就是TCP的重传策略

总结

本章的重点主要是理解,TCP与UDP协议的特性和优缺点对比,重点理解传输层中TCP的三次握手中控制位处于什么状态以及变化。