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

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

TCP的拥塞控制算法

TCP的可靠传输如如何实现的?
TCP使用以字节为单位的滑动窗口,通过确认机制和重传机制处理数据丢失,保证数据的有序性、完整性。(主要机制)
发送方维护一个发送窗口,,发送窗口中前半段是已发送的字节,后半段是等待发送的字节。
发送方发送的报文段的起始序号和字节长度

接收方收到报文段后会发送确认报文段,(ack表示确认34之前的字节已按序收到,rwnd表示接收窗口长度)
发送方收到确认报文段后,一般会随之调整滑动窗口(发送窗口)的位置。

当数据丢失(如网络丢包)或损坏(校验和错误)时,重传机制会重新发送丢失的字节(或者报文段),确保数据完整。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状态)

为什么要进行三次握手?
- 确认双方 “收发能力正常”
第一次握手:服务器知道 “客户端能发送”(因为收到了SYN),但客户端不知道服务器是否能接收或发送。
第二次握手:客户端知道 “服务器能接收(收到了自己的SYN)且能发送(自己收到了服务器的SYN+ACK)”,但服务器不知道客户端是否能接收自己的SYN。
第三次握手:服务器知道 “客户端能接收”(因为收到了确认自己SYN的ACK)。
至此,双方确认:客户端能发能收,服务器也能发能收,双向通信的基础成立。 - 同步双方的初始序号seq
TCP 数据传输依赖 “字节序号” 保证有序性和去重(每个字节都有唯一序号),而序号的起点(seq)是随机生成的(防止旧报文干扰)。
三次握手使得双方相互确认初始序号。
只有两次握手会出现什么状况?
假设两次握手成立:服务器收到SYN后,回复SYN+ACK并直接进入连接状态,等待客户端发送数据。
但此时,服务器并不知道客户端是否收到了自己的SYN+ACK,如果客户端的SYN是 “过期的旧报文”(比如因网络延迟滞留的报文),
旧SYN到达服务器,服务器误以为是新连接,回复SYN+ACK并建立连接,占用端口、缓冲区等资源;

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(最长报文端寿命)后才进入关闭状态)

为什么客户端第四次挥手后还有个时间等待状态time-wait?
如果第四次挥手所发送的确认报文段丢失,TCP服务端没收到确认报文段会触发超时重传,如果客户端直接进入关闭状态closed,不会进行响应。TCP服务进程就会一直无法进入关闭状态。
TCP中保活计时器的作用
如果客户设备突然出现故障,那么服务端和客户端不能正常四次挥手释放连接,需要服务端检测客户进程状态

TCP 本身是操作系统内核中的协议栈实现
TCP 协议栈的运行不需要占用端口号,而 “应用程序”(如浏览器、服务器程序)是用户态的进程,它们通过系统调用(如bind()、connect())使用 TCP 协议进行通信时,必须绑定端口号。
TCP报文段首部格式
(老师的图里已经讲的很清晰了)


浙公网安备 33010602011771号