传输层相关内容

192 阅读7分钟

一.TCP的特征

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

二.UDP的特性

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

三.TCP与UDP的区别

微信截图_20220716185528.png

据图可以看出:

TCP传输速度慢,但是稳定。

UDP传输速度快,但是不稳定。

TCP十一种状态(六种控制位)

微信截图_20220716190856.png

  • SYN:同步序号位,tcp需要建立连接时将该值设为1。
  • ACK:确认序号位,当该位值为1时 ,用于确认发送方的数据。
  • FIN:当tcp断开连接时该位值为1. (重点)

六种控制位(重点)

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

  • 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,即告诉对方: “我的数据已经发送完毕,你可以释放连接了”,带FIN 标志的TCP报文段称为结束报文段

其他状态
  • 源端口、目标端口:计算机上的进程要和其他进程通 信是要通过计算机端口的,而一个计算机端口某个时 刻只能被一个进程占用,所以通过指定源端口和目标 端口,就可以知道是哪两个进程需要通信。源端口、 目标端口是用16位表示的,可推算计算机的端口个数 为2^16个,即 65536 (0-65535)

  • 序列号:表示本报文段所发送数据的第一个字节的编 号。在TCP连接中所传送的字节流的每一个字节都会 按顺序编号。由于序列号由32位表示,所以每2^32个 字节,就会出现序列号回绕,再次从0 开始 无限循 环

  • 确认号:(ack)表示接收方期望收到发送方下一个 报文段的第一个字节数据的编号。也就是告诉发送 方:我希望你(指发送方)下次发送的数据的第一个 字节数据的编号为此确认号:传输是否有问题?

  • 数据偏移/首部长度:表示TCP报文段的首部长度, 共4位,由于TCP首部包含一个长度可变的选项部分, 需要指定这个TCP报文段到底有多长。它指出 TCP 报 文段的数据起始处距离 TCP 报文段的起始处有多远。 该字段的单位是32位(即4个字节为计算单位),4位 二进制最大表示15,所以数据偏移也就是TCP首部最 大60字节

  • 窗口大小:表示现在允许对方发送的数据量,也就是 告诉对方,从本报文段的确认号开始允许对方发送的 数据量,达到此值,需要ACK确认后才能再继续传送 后面数据,由Window size value * Window size scaling factor(此值在三次握手阶段TCP选项 Window scale协商得到)得出此值

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

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

四. 三次握手(重点,重点,重点,面试必会)

image.png

  • TCP连接的建立,由服务器根据ACK决定是否建立连接
  • 最开始的时候客户端和服务器都是处于CLOSED状态。
    主动打开连接的为客户端,被动打开连接的是服务器。
  • 详细过程如下 SYN:同步序列编号(Synchronize Sequence Numbers)。

微信截图_20220716193641.png

五.四次分手

  • 数据传输完毕后,双方都可释放连接。

  • 最开始的时候,客户端和服务器都是处于ESTABLISHED状态(建立连接。表示两台机器正在通信),

  • 然后客户端主动关闭,服务器被动关闭

  • 详细过程如下

  1. 首先客户端向服务端发送一个FIN包,进入FIN_WAIT1状态,
  2. 服务端收到后,向客户端发送ACK确认包,进入CLOSE_WAIT状态,
  3. 然后客户端收到ACK包后进入FIN_WAIT2状态,
  4. 然后服务端再把自己剩余没传完的数据发送给客户端,发送完毕后在发送一个FIN+ACK包,进入LAST_ACK(最后确认)状态,
  5. 客户端收到FIN+ACK包后,再向服务端发送ACK包,在等待两个周期后再关闭连接
  • 数据传输完毕后,双方都可释放连接。

  • 最开始的时候,客户端和服务器都是处于ESTABLISHED状态(建立连接。表示两台机器正在通信),

  • 然后客户端主动关闭,服务器被动关闭

  • 详细过程如下

    • 首先客户端向服务端发送一个FIN包,进入FIN_WAIT1状态,
    • 服务端收到后,向客户端发送ACK确认包,进入CLOSE_WAIT状态,
    • 然后客户端收到ACK包后进入FIN_WAIT2状态,
    • 然后服务端再把自己剩余没传完的数据发送给客户端,发送完毕后在发送一个FIN+ACK包,进入LAST_ACK(最后确认)状态,
    • 客户端收到FIN+ACK包后,再向服务端发送ACK包,在等待两个周期后再关闭连接

image.png

微信截图_20220716194636.png

六。延申问题

为什么建立连接是三次握手,而断开连接是四次挥手呢?

  • 建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。

  • 而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据

    • 而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,
    • 等全部传输完毕,再发送FIN报文给对方来表示同意现在关闭连接,
    • 因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。

\