计算机网络——TCP 协议总结

TCP 协议总结

1、主要特点

  1. TCP 是面向连接的传输层协议;

  2. 每一条 TCP 连接只能有两个端点(endpoint)

  3. TCP 提供可靠交付的服务;

  4. TCP 提供全双工通信

  5. 面向字节流

    端点:即套接字(socket),套接字 socket = (IP地址:端口号) TCP连接 ::= {socket1,socket2} = {(IP1:port1),(IP2:port2)}
    :流入到进程或从进程流出的字节序列。
    面向字节流:TCP 把应用程序交下来的数据仅仅看成是一连串无结构的字节流,并不知道所传送的字节流的含义。
    TCP 面向字节流的概念

2、TCP 和 UDP 的区别

UDP TCP
有无连接 无连接 面向连接
是否可靠 不可靠传输,不使用流量控制和拥塞控制 可靠交付,使用流量控制和拥塞控制
连接对象个数 支持一对一、一对多、多对一通信 只能是一对一通信
传输方式 数据报文 面向字节流
首部开销 开销小,8 个字节 20 ~ 60 个字节
适用场景 适用于实时应用(视频会议、直播等) 适用于要求可靠传输的应用,例如文件传输

3、TCP 头部

TCP 头部格式
头部主要字段的意义如下:

  1. 源端口和目的端口

    各占 2 个字节,分别写入源端口号和目的端口号。

  2. 序号

    占 4 个字节,范围是 [0,232-1]。序号使用 mod 232 运算,当序号增加到 232-1后,下一个序号又会回到 0。

    扫描二维码关注公众号,回复: 17080753 查看本文章
  3. 确认号

    占 4 个字节,是期望收到对方下一个报文段的第一个数据字节的序号,通常用 ack 表示。

  4. 数据偏移

    占 4 位,通常表示 TCP 报文段的首部长度

  5. 控制位

    1. 紧急 URG(URGent)
    当 URG = 1 时表明该字段有效,发送方 TCP 会把紧急数据插入到本报文段数据的最前面,通常与首部中的紧急指针字段配合使用。
    2. 确认 ACK(ACKnowledgment)
    当 ACK = 1 时表明该字段有效,TCP 规定在建立连接后所有传送的报文段都必须把 ACK 置为 1
    3. 复位 RST(ReSeT)
    当 RST = 1 时表明 TCP 连接中出现严重差错(如主机崩溃等)必须释放连接,然后再重新建立传输连接。RST 置为 1 还用来拒绝一个非法的报文段或拒绝打开一个连接。
    4. 同步 SYN(SYNchronization)
    当 SYN = 1 且 ACK = 0 时表明是一个连接请求报文段,对方若同意建立连接则会在响应的报文段中使用 SYN = 1 且 ACK = 1。
    5. 中止 FIN(FINis)
    当 FIN = 1 时表明发送方的数据已发送完毕,并要求释放连接。

  6. 窗口

    占 2 个字节,窗口值是[0,216-1]之间的整数,作为接收方让发送方设置其发送窗口的依据

  7. 选项

    长度可变,最长可达 40 字节,包括最大报文段长度 (MSS) 选项、窗口扩大选项、时间戳选项、选择确认(SACK)选项等。

4、三次握手——建立连接

TCP 三次握手

注意点】:

  1. TCP 客户进程和服务器进程首先会创建传输控制块(TCB)

    传输控制块(TCB:Transfer Control Block):存储了每个连接中的一些重要信息,例如:TCP 连接表、指向发送和接收缓存的指针、指向重传队列的指针、当前发送和接收的序号等等。

  2. TCP 规定 SYN 报文段不能携带数据,但要消耗掉一个序号 (seq)

  3. TCP 规定 ACK 报文段可以携带数据,但如果不携带数据则不消耗序号

  4. 客户进程为什么要发送最后一次确认?

    原因:假定 A 发出的第一个连接请求在某些网络节点处滞留,然后 A 重传一次连接请求,收到 B 的确认报文段后建立连接并传输数据。若连接释放后的某个时间第一个连接请求被 B 收到,此时 B 误以为 A 又发出一次新的连接请求,向 A 发出报文段同意建立连接。但是 A 并没有发出建立连接的请求,因此不会理会 B 的确认,也不会向 B 发送数据,但 B 以为有新的连接建立并一直等待 A 发来数据,从而造成资源的浪费。

5、四次挥手——释放连接

TCP 四次挥手

注意点】:

  1. TCP 规定 FIN 报文段即使不携带数据也要消耗一个序号

  2. 序号 u、v、w 均为已传送过的数据的最后一个字节的序号加 1

  3. MSL (Maximum Segment Lifetime):最长报文段寿命,一般设为 2 分钟,TCP 允许根据具体情况使用更小的 MSL 值;

  4. A 处于时间等待(TIME-WAIT)状态时为什么必须等待 2MSL 的时间

    a. 为了保证 B 可以正常进入 CLOSED 状态(即正常关闭 TCP 连接)。

    若处于LAST-ACK(最后确认)状态的 B 没有收到 A 发送的最后一个 ACK 报文段,则会超时重传 FIN + ACK 报文段,在 2MSL 时间内 A 可以收到该报文段并重传 ACK 报文段并重新启动 2MSL 计时器,直至 A 和 B 都正常进入 CLOSED 状态。

    b. 防止出现因网络滞留而失效的连接请求报文段。

    A 发送完最后一个 ACK 报文段后再经过 2MSL 的时间后会清空本次连接所产生的所有报文段,因此不会进行超时重传。

  5. 保活计时器 (keepalive timer) 可以防止客户端和服务器建立 TCP 连接后突然故障导致服务器资源浪费的情况的发生。

    服务器每收到一次客户端的数据就重新设置保活计时器,时长一般为 2 小时。若间隔 2 小时后未收到客户端的数据,服务器就会发送一个探测报文段,之后每隔 75 秒发送一次。若连续发送 10 个探测报文段后客户端仍无响应,服务器就会关闭连接。

6、流量控制

目的:控制发送方的发送速率,保证接收方来得及接收。

注:流量控制往往是指点对点通信量的控制,是个端到端的问题。

方法:滑动窗口机制

TCP 会话的双方都各自维护一个发送窗口和一个接收窗口。接收窗口的大小取决于应用、系统、硬件的限制,而发送窗口的大小则取决于对端通信的接收窗口。TCP 头部包含 window 字段,16位,代表窗口的字节容量,最大为 65535,接收方通过发送确认报文头部中的 window 字段来控制发送窗口的大小,若设置为 0 则发送方不能发送数据。

注:TCP 的窗口单位是字节,不是报文段。

TCP 滑动窗口

7、拥塞控制

目的:防止过多的数据注入网络中,避免路由器或链路过载。

注:拥塞控制是一个全局性的过程。

方法

  1. 慢开始(slow-start)

    发送方维持一个拥塞窗口 cwnd (congestion window) 状态变量,初始设置为 1 个 SMSS 的数值,在每收到一个对新的报文段的确认后,把拥塞窗口增加至多一个 SMSS 的数值。每经过一个传输轮次,拥塞窗口就加倍。为了防止 cwnd 增长过大引起网络拥塞,还要设置一个慢开始门限 ssthresh 状态变量。

    • 当 cwnd < ssthresh 时,使用慢开始算法;
    • 当 cwnd = ssthresh 时,使用慢开始算法或者拥塞避免算法;
    • 当 cwnd > ssthresh 时,停止使用慢开始算法,改用拥塞避免算法;
  2. 拥塞避免(congestion avoidance)

    每经过一个往返时间 RTT 就把发送方的拥塞窗口 cwnd 加 1,按照线性规律缓慢增长,具有 “加法增大”(AI:Additive Increase)的特点。

    无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(未按时收到确认报文),就要把慢开始门限 ssthresh 设置为发送窗口值的一半(但不能小于 2 ),然后把拥塞窗口重新设置为 1,执行慢开始算法。这样做的目的是迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间处理队列中积压的分组

  3. 快重传(fast retransmit)

    要求接收方不要等待自己发送数据时才进行捎带确认,而要立即发送确认,即使收到了失序的报文段。规定发送方只要连续收到 3 个重复确认 M2,就立即进行重传 M3。快重传可以让发送方尽早知道发生了报文段的丢失。

  4. 快恢复(fast recovery)

    当发送方连续收到 3 个重复确认后会把慢开始门限 ssthresh 减半,接着把 cwnd 的值设为减半后 ssthresh 的值,然后开始执行拥塞避免算法。快恢复算法具有 “乘法减小”(MD:Multiplicative Decrease)的特点,与拥塞避免算法合称为 AIMD 算法。

    注:在采用快恢复算法时,慢开始算法只是在 TCP 连接建立时和网络出现超时时才使用。

TCP 拥塞控制

猜你喜欢

转载自blog.csdn.net/Alan_Walker688/article/details/126175881