计算机网络学习笔记:运输层概述UDP、TCP对比
文章目录
- 一、运输层
- 1.1、端口号
- 1.2、发送方的复用
- 1.3、接收方的分用
- 二、一次HTTP请求的交互流程
- 三、TCP、IP协议的对比
- 3.1、单播,多播,广播的支持
- 3.2、应用层报文的处理
- 3.3、可靠传输的支持
- 3.4、报文首部的区别
一、运输层
运输层
位于网际层
之上,应用层
之下。(基于四层网络模型)相比于网际层
主机到主机之间的数据传输,运输层
的主要作用是为运行在不同主机上的应用进程之间提供可靠或不可靠的数据传输服务。(逻辑通信)
它的核心功能包括:
- 进程之间的通信
- 复用与分用
- 差错检测与纠正,通过校验和机制检测数据在传输过程中是否被损坏。
- 流量控制、拥塞控制、可靠传输(只限于TCP)
TCP和UDP是运输层的两个重要协议。
1.1、端口号
运行在计算机上的进程,是使用PID进行标识的,在windows下可以通过tasklist
命令去查询进程对应的PID。
而不同的操作系统,对于PID的格式是不同的:
比较项 | Windows | Linux |
---|---|---|
数据类型 | DWORD(32位无符号整型) | pid_t (通常是32位有符号整型) |
显示格式 | 十进制整数 | 十进制整数 |
起始值 | 通常从 4 起(系统保留 0~3) | 通常从 1 起(PID 1 是 init 或 systemd ) |
最大值 | 理论上最大值为 2^32 - 1 = 4294967295 ,但通常远小于此 | /proc/sys/kernel/pid_max 控制,默认 32768,最大支持到约 4,194,304 |
查看方式 | tasklist 、任务管理器、Get-Process 等 | ps , top , htop , cat /proc/<pid> , pidof 等 |
PID 是否连续 | 不连续,Windows 的 PID 分配较分散 | 通常近似递增,但在高负载或多线程下也可能跳跃 |
特殊 PID | 无 PID=1 等传统意义的“init进程” | PID 1 是 init 或 systemd,所有其他进程的祖先进程 |
支持 PID 回收 | 是 | 是 |
端口号则是屏蔽了不同操作系统之间的PID的区别,以此作为TCP/IP体系的应用进程的标识。端口号的长度为16bit,取值范围为0~65535,端口是运输层
的概念,起到连接应用层
和传输层
的作用。相比较于IP,IP标识的是主机,而端口标识的是主机中的应用进程。
运输层的端口号,又可以进行细分:
本文图片来源:深入浅出计算机网络 微课视频
1.2、发送方的复用
复用和分用,也是运输层
的两个重要概念,指的是不同的应用层
的进程,都可以使用同一个传输层
协议传送数据,以及接收方的传输层
,在去除报文首部后,可以交付到正确的应用层
进程。复用和分用,都可以分为UDP,TCP,IP三种类型,应用层
首先根据端口号,将应用报文发送至应用层
。
应用层
进程的应用报文,在运输层
被UDP协议封装,称为UDP复用。应用层
进程的应用报文,在运输层
被TCP协议封装,称为TCP复用。
UDP协议封装成的是用户数据报,而TCP协议封装成的是报文段:
在网际层
使用IP协议统一封装成IP数据报,称为IP复用,IP数据报首部协议的值,用于表示封装的是何种协议数据单元:
- 6:TCP报文段
- 17:UDP数据报
1.3、接收方的分用
接收方会对于IP数据报进行分用:
- 如果6 - TCP报文段 交给
运输层
,由TCP协议进行处理。 - 如果17 - TCP报文段 交给
运输层
,由UDP协议进行处理。
在运输层
,对于TCP和UDP进行各自的分用。根据端口号向上交付给应用层
的相应进程。
二、一次HTTP请求的交互流程
假设我当前用户PC的IP地址是192.168.0.1,web服务器的域名是www.porttest.com,DNS服务器存储了域名和服务器IP的对应关系。
DNS服务器是互联网中的一个分布式数据库系统,用于将“人类可读的域名”(如 www.baidu.com)转换为“计算机能识别的 IP 地址”(如 39.156.66.18),DNS服务器的分类:
类型 | 作用 | 举例 |
---|---|---|
本地 DNS 服务器(递归服务器) | 通常由你的网络提供商或操作系统配置;处理所有域名解析请求 | 114.114.114.114 (阿里)、8.8.8.8 (Google) |
根 DNS 服务器 | 全球仅有13组,指向顶级域服务器 | 无需你手动配置,系统默认递归中用 |
顶级域 DNS 服务器(TLD) | 负责 .com 、.cn 、.net 等域名后缀的解析指引 | 也由系统递归调用 |
权威 DNS 服务器 | 真正存储某个域名的 IP 映射关系 | 如 ns1.baidu.com 是 baidu.com 的权威 DNS |
你在浏览器输入:https://www.baidu.com
,
操作系统的步骤如下:
- 查询本地缓存有没有 www.baidu.com 的 IP;
- 如果没有,问本地 DNS 服务器(如 114.114.114.114);
- 本地 DNS 会向根服务器询问 .com ;
- 再找 .com 的权威服务器要 baidu.com;
- 最终找到 www.baidu.com 的权威服务器,返回它的 IP;
- 系统拿到 IP,开始真正访问网页服务器。
用户输入的是域名,不知道域名对应的真实ip地址是多少,所以需要经过下面的一系列处理:
- 用户在浏览器上输入域名,用户pc中的DNS客户进程,发送一个DNS查询请求报文。查询域名对应的IP地址,具体是使用UDP协议,将请求封装成UDP用户数据报,包含源端口和目标端口:
- 源端口的值,由系统在短暂端口号中随机选取未被占用的。
- 目标端口的值,设置成53(DNS服务器进程的熟知端口号)
- 用户进程将UDP数据报封装成IP数据报,发送给DNS服务器,DNS服务器收到后,进行解析。查询地址,并且发给用户PC响应报文。
- 用户PC解析响应报文,得到域名对应的IP,然后系统将短暂端口号进行回收。
- 用户PC向web服务器发出请求报文,HTTP请求报文需要使用TCP协议。
- web服务器的HTTP服务进程,解析HTTP请求报文的内容,按其要求查找首页内容,返回给用户PC,发送HTTP响应报文,需要用到运输层的TCP协议。
- 由用户PC中的HTTP客户进程解析http响应报文的内容,并在浏览器上展示。最后回收短暂端口号。
为何查询DNS服务器使用的是UDP协议?
DNS 是一个查询-响应的过程,通常涉及的是短小的数据交换,并且查询本身是非常频繁且大量的。由于 UDP 协议不进行连接建立、状态维护等,响应速度很快,这对于 DNS 查询这样的高频、低延迟应用非常重要。即使某次查询丢失,客户端可以在短时间内重新发送查询请求,而不需要像 TCP 那样进行复杂的重传机制。
三、TCP、IP协议的对比
首先,从整体上看,UDP是用户数据报协议,TCP是传输控制协议,UDP是无连接的,在传送数据之前,无需创建连接,所以可以随时收发数据。TCP需要通过三报文握手建立连接,四报文挥手释放连接。
3.1、单播,多播,广播的支持
- UDP协议支持单播,多播和广播,因为它是无连接的,UDP可以向局域网中的任何其他机器发送单播,广播,多播。
- TCP仅支持一对一的单播,因为一条 TCP 连接必须绑定在一个源 IP:端口 和 一个目标 IP:端口 上,严格的一对一结构,如果是一对多,则会存在发出一个 TCP 包 → 有多个机器同时返回 ACK的情况,这样会面临很多问题:
- 如果某个主机挂掉,是中断连接?还是继续维持?
- 如果一个收到、一个没收到,是重传还是终止?
- 序列号怎么维护?N 台机器的接收窗口都一样吗?
3.2、应用层报文的处理
- UDP:应用层直接将报文发送给运输层的UDP,而UDP要增加一个报文首部,接收方在接收到后,会去掉报文首部,交付给应用层。(保留报文的边界,UDP是面向报文的协议),不会存在半包,粘包的问题。
- TCP:将应用层交付的报文,看作是字节流进行处理,TCP仅仅将它们编号并且存入当前的发送缓存中,并且构建TCP报文段进行发送。接收方会从接收到的TCP报文段中,取出数据载荷并且存储在接收缓存中,并且将字节交付给应用层,会存在半包,粘包问题。
3.3、可靠传输的支持
首先作为TCP,UDP下层的网际层IP协议,提供的是无连接,不可靠的传输。
- UDP:UDP同样提供给应用层无连接,不可靠的传输,这里的不可靠,体现在UDP检测出错误数据后,就直接丢弃。同时如果发送方的消息,没有路由到接收方,UDP也不会进行处理。
- TCP:向上层提供了可靠,面向连接的传输,解决误码,丢失,乱序和重复的问题。
3.4、报文首部的区别
- UDP的首部信息,主要是标记端口,仅仅占用8个字节。
- TCP的首部,需要保证可靠传输,流量控制,拥塞控制,比UDP复杂的多,最少20个字节,最大60个字节。