计算机网络—运输层—TCP/UDP

TCP/UDP对比

UDP(User Datagram Protocol) TCP(Transmission Control Protocal)
无连接:通信双方可直接发送数据 面向连接的:三次握手,通信,四次挥手
UDP支持单播、多播和广播 TCP仅支持单播 一对一通讯
UDP是面向应用报文的:对应用进程交付的报文既不合并也不拆分 TCP是面向字节流的:对应用程序交付的字节流进行编号,传输
不可靠:用户数据报的丢失和误码,UDP并不处理 可靠的:确保不出现传输查重

image

TCP的特性

TCP的流量控制

感觉还是老师视频里讲的明了
【计算机网络微课堂(有字幕无背景音乐版)】 https://www.bilibili.com/video/BV1c4411d7jb/?p=60&share_source=copy_web&vd_source=0a3f7f13ede45276c02cf7397c32c90b

TCP的拥塞控制

image

TCP的拥塞控制算法

image

TCP的可靠传输如如何实现的?

TCP使用以字节为单位的滑动窗口,通过确认机制和重传机制处理数据丢失,保证数据的有序性、完整性。(主要机制)

发送方维护一个发送窗口,,发送窗口中前半段是已发送的字节,后半段是等待发送的字节。
发送方发送的报文段的起始序号和字节长度

image

接收方收到报文段后会发送确认报文段,(ack表示确认34之前的字节已按序收到,rwnd表示接收窗口长度)

发送方收到确认报文段后,一般会随之调整滑动窗口(发送窗口)的位置。

image

当数据丢失(如网络丢包)或损坏(校验和错误)时,重传机制会重新发送丢失的字节(或者报文段),确保数据完整。TCP 的重传机制主要包括超时重传和快速重传。

TCP运输连接有三个阶段

  • 建立TCP连接 三次握手
  • 数据传送
  • 释放TCP连接 四次挥手

1 TCP建立连接

TCP建立连接的目的

  • 使TCP双方能够明确感知对方存在
  • 使TCP双方能够协商一些参数(最大窗口值,窗口扩大选项等)
  • 使TCP双方能对运输实体资源(例如缓存大小,链接表中的项目等)进行分配。

TCP建立连接的过程 三次握手 (※)

TCP建立连接前,TCP服务端处于监听状态(Listen)

  • 第一次握手 TCP客户端发送连接请求: 发送请求报文段( 首部中同步标志位SYN=1,表示这是一个请求报文;序号字段随机赋值seq=x,作为客户进程的初始序号) 客户端进入SYN-sent状态,同步已发送
  • 第二次握手 服务器收到建立连接报文段后,发送确认报文段:(首部中同步标志位SYN=1确认位ACK=1,seq=y,ack=x+1ack是对客户进程初始序号的确认) 服务端进入SYN-rcvd状态,同步已接收
  • 第三次挥手,客户端收到确认后(进入Established状态),向服务端发送确认报文段:(确认位ACK=1表明这是普通报文段;报文段序号为seq=x+1表示seq表示所携带数据的第一个字节在整个数据流中的序号;ack=y+1对服务器进程序号字段的确认)服务端也进入(进入Established状态)

image

为什么要进行三次握手?

  1. 确认双方 “收发能力正常”
    第一次握手:服务器知道 “客户端能发送”(因为收到了SYN),但客户端不知道服务器是否能接收或发送。
    第二次握手:客户端知道 “服务器能接收(收到了自己的SYN)且能发送(自己收到了服务器的SYN+ACK)”,但服务器不知道客户端是否能接收自己的SYN。
    第三次握手:服务器知道 “客户端能接收”(因为收到了确认自己SYN的ACK)。
    至此,双方确认:客户端能发能收,服务器也能发能收,双向通信的基础成立。
  2. 同步双方的初始序号seq

TCP 数据传输依赖 “字节序号” 保证有序性和去重(每个字节都有唯一序号),而序号的起点(seq)是随机生成的(防止旧报文干扰)。
三次握手使得双方相互确认初始序号。

只有两次握手会出现什么状况?

假设两次握手成立:服务器收到SYN后,回复SYN+ACK并直接进入连接状态,等待客户端发送数据。
但此时,服务器并不知道客户端是否收到了自己的SYN+ACK,如果客户端的SYN是 “过期的旧报文”(比如因网络延迟滞留的报文),
旧SYN到达服务器,服务器误以为是新连接,回复SYN+ACK并建立连接,占用端口、缓冲区等资源;
image

2 数据传输

3 TCP释放连接

TCP释放连接的过程

使用TCP客户进程的应用进程通知TCP进程主动关闭TCP连接,释放连接开始。

  • 第一次挥手:TCP客户进程发送连接释放报文段,并进入终止等待1状态。报文段首部中(终止标志位FIN=1,确认位ACk=1 表明这是释放报文段;seq=u,延续自身字节序号,ack=v对上一个收到的信息回应)
  • 第二次挥手:TCP服务器进程收到释放报文,会发送一个确认报文段(首部中,确认位ACK=1,表明这是一个普通的确认报文段;seq=v 表示字节序号;确认号ack=u+1 ),然后通知高层应用进程用户要断开TCP连接

(此时TCP连接处于半关闭状态,即TCP客户进程不会再发送数据了;但此时TCP服务进程如果还有数据要发送,TCP客户进程可以接收;TCP客户进程收到确认报文段进入终止等待2状态

  • 第三次挥手:服务端应用进程发送完最后的数据后,通知TCP服务进程释放连接。TCP服务进程发送TCP释放报文段,进出Last-ACK(最后确认状态);报文段首部中(终止位FIN=1,确认位ACk=1 表明这是释放报文段;序列号seq=w 因为中间服务端可能发送了一些字节;确认号ack=u+1)
  • 第四次挥手:客户端收到TCP释放报文段后,发送普通确认报文段,然后进入时间等待(time-wait)状态。(首部确认位ACK=1 表明这是普通确认报文段)

(TCP服务进程收到确认报文段后进入关闭状态(Closed);而TCP客户进程则需要等2MSL(最长报文端寿命)后才进入关闭状态)
image

为什么客户端第四次挥手后还有个时间等待状态time-wait?

如果第四次挥手所发送的确认报文段丢失,TCP服务端没收到确认报文段会触发超时重传,如果客户端直接进入关闭状态closed,不会进行响应。TCP服务进程就会一直无法进入关闭状态。

TCP中保活计时器的作用

如果客户设备突然出现故障,那么服务端和客户端不能正常四次挥手释放连接,需要服务端检测客户进程状态
image

TCP 本身是操作系统内核中的协议栈实现

TCP 协议栈的运行不需要占用端口号,而 “应用程序”(如浏览器、服务器程序)是用户态的进程,它们通过系统调用(如bind()、connect())使用 TCP 协议进行通信时,必须绑定端口号。

TCP报文段首部格式

(老师的图里已经讲的很清晰了)
image

UDP

posted @ 2025-07-24 14:19  浪矢-CL  阅读(10)  评论(0)    收藏  举报