TCP篇

本文最后更新于:2022年7月29日 下午

计算机网络中的TCP部分,简单复习一下。

TCP篇

OSI七层协议

OSI七层从下至上分别为

  1. 物理层:定义了物理设备标准,主要作用是传输比特流,这一层的数据叫比特
  2. 数据链路层:定义了如何让格式化数据以进行传输,以及如何让控制对物理介质的访问,
  3. 网络层:对网络中的两个主机系统之间提供连接和路径选择
  4. 传输层:定义一些传输数据的协议和端口号
  5. 会话层:负责在数据传输中设置和维护计算机网络中两台计算机之间的通信连接
  6. 表示层:数据转换为能与接收者的系统格式兼容并适合传输的格式
  7. 应用层:为应用软件而设计的接口,以设置与另一应用软件之间的通信

TCP、UDP协议是作用来传输层的协议

TCP基础知识

tcp是什么

tcp的全称是 Transmission Control Protocol,即传输控制协议,它的重点在于控制,控制传输的可靠、有序的传输以及端对端的流量控制、拥塞控制等

TCP连接是什么

我们都知道TCP是基于连接的,所谓连接即双方都维护了一个状态,并在米一次通信间来更新这个状态。

TCP协议头

在深入了解TCP协议之前我们先来看下TCP的协议头吧,这里我截取了 维基百科传输协议控制 的图。

image-20210714170908967

我们不一定需要完全了解整体的内容,这里我挑选几个重要的参数来说

  1. 端口:包括源端口和目标端口
  2. seq :序列号,用来解决包乱序问题
  3. ack :确认号,用来解决丢包问题
  4. 窗口大小 :即滑动窗口大小,用来控流
  5. 标志位 :标识这个包是什么类型的,用来控制TCP的状态

三次握手

三次握手是建立TCP连接的步骤。我们先来看图

image-20210714173409157

为什么需要三次握手:为了初始化SeqNumer,并且三次握手时确保双方的发送接收功能都正常。

四次挥手

四次挥手和三次握手类似,先看图

为什么需要四次挥手:因为TCP是全双工协议,也就是说双方都需要关闭。每一方都向对方发送FIN和回应ACK。从图中可以看到主动关闭方的状态是 FIN_WAIT_1 到 FIN_WAIT_2 然后再到 TIME_WAIT,而被动关闭方是 CLOSE_WAIT 到 LAST_ACK。

为什么一定要有TIME_WAIT

断开连接发起方在接受到接受方的 FIN 并回复 ACK 之后并没有直接进入 CLOSED 状态,而是进行了一波等待,等待时间为 2MSL。

MSL 是 Maximum Segment Lifetime,即报文最长生存时间,RFC 793 定义的 MSL 时间是 2 分钟,Linux 实际实现是 30s,那么 2MSL 是一分钟。

那么为什么要等 2MSL 呢?

  • 就是怕被动关闭方没有收到最后的 ACK,如果被动方由于网络原因没有到,那么它会再次发送 FIN, 此时如果主动关闭方已经 CLOSED 那就傻了,因此等一会儿。
  • 假设立马断开连接,但是又重用了这个连接,就是五元组完全一致,并且序号还在合适的范围内,虽然概率很低但理论上也有可能,那么新的连接会被已关闭连接链路上的一些残留数据干扰,因此给予一定的时间来处理一些残留数据。

那么等待2MSL会引起什么问题呢,如果是服务器主动关闭了大量连接,会出现较大的资源占用问题,

写在最后

2021-07-14 17:43

先写到这里吧,今天的事情有点多。还有很多地方没有写完的明天再写


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!