网络基础知识
# 网络基础知识
# 1. TCP/IP协议
# 1.什么是协议
协议(Protocol) 指的是计算机网络传输数据时遵循的规则和标准。在计算机网络中,各个设备通过协议进行通信,以确保数据的可靠性、安全性和正确性。它定义了在计算机网络中进行通信所需的规则和标准,并规定了通信的格式、内容、顺序、错误处理等细节。
协议可以根据功能和层级分类,常见的协议有:
- 应用层协议: 如HTTP、FTP、SMTP等,主要用于应用程序之间的通信和数据传输。
- 传输层协议: 如TCP、UDP等,主要负责数据传输的可靠性和流量控制。
- 网络层协议: 如IP、ICMP、ARP等,主要处理数据在网络中的路径选择和寻址。
- 数据链路层协议: 如以太网协议、PPP协议等,主要负责物理设备之间的数据传输。
协议的制定依赖于计算机网络的发展和应用需求。随着网络技术的不断发展,协议也在不断完善和更新。例如,IPv4协议在全球范围内广泛使用,但其地址空间有限;IPv6协议则扩大了地址空间,但目前仍在逐步普及中。在网络通信中,合理使用和选择协议是确保网络通信顺畅的重要因素。
# 2.协议的必要性
协议在计算机网络中是非常必要的,可以从以下几个方面来说明协议的重要性:
- 规范通信规则: 计算机网络中的各个设备需要通过协议来进行通信。协议规定了通信的格式、内容、顺序、错误处理等细节,确保不同设备之间能够正确理解和解释通信内容。协议的存在使得网络中的设备能够按照统一的规则进行通信,避免了混乱和冲突。
- 提供可靠性和安全性: 协议定义了数据传输的可靠性和安全性相关的机制。例如,TCP协议提供了可靠的数据传输机制,确保数据不丢失、不重复、按顺序到达目标设备。SSL/TLS协议提供了加密和身份验证机制,确保数据在传输过程中的机密性和完整性。协议的存在使得网络通信更加安全可靠,有效保护了通信内容的隐私性和完整性。
- 支持互操作性: 协议的制定和广泛应用使得不同厂商、不同平台的设备能够进行互相通信。无论是硬件设备还是软件应用,只要符合同一个协议标准,就可以实现互操作性,从而实现信息的共享和交换。协议的存在促进了设备和应用之间的互联互通,推动了计算机网络的发展和应用。
- 促进网络发展和标准化: 协议是网络发展和标准化的基础。通过制定和遵循协议,可以促进网络技术的发展和应用。网络中的各种新功能、新服务都需要有相应的协议支持。同时,协议的标准化也有助于推动行业内的一致性和互操作性,降低了开发成本和复杂性。
笔记
简单来说,协议就是计算机与计算机之间通过网络通信时,事先达成的一种 “约定”。这种“约定”使不同厂商的设备、不同的CPU以及不同操作系统组成的计算机之间,只要遵循相同的协议就能够实现通信。这就好比一个中国人说汉语一个外国人说英语使用不同的国家语言进行沟通,怎么也无法理解。如果两个人约定好 都说中文或英文,就可以互相沟通通信。协议分为很多种,每一种协议都明确界定了它的行为规范。两台计算机必须能够支持相同的协议,并遵循相同协议进行处理,这样才能实现相互通信。
# 2. 端口和套接字
# 1.关于端口
在计算机网络中,端口(Port)是指一种标识网络服务的机制,是用于标识不同网络应用程序的数字。每个TCP或UDP连接都需要一个端口来确定要发送或接收的数据类型。TCP/IP协议中,端口号范围从0到65535。
端口的作用是在互联网上标识特定的应用程序和服务,使得不同的应用程序可以通过互联网同时运行,并且互不干扰。具体来说,端口主要有以下几个方面的作用:
- 标识应用程序: 同一台计算机上不同的应用程序可以使用不同的端口号标识自己。当网络上接收到数据包时,根据端口号来确定数据包应该交给哪个应用程序处理。
- 区分服务类型: 不同的端口号对应不同的服务类型,例如HTTP协议默认使用80端口,FTP协议默认使用21端口。这样可以使得网络上的数据包被正确地路由到相应的服务。
- 控制网络访问: 在防火墙等安全设备中,可以根据端口号来限制对某些服务的访问。例如,可以设置防火墙规则,只允许80端口 (HTTP) 的数据通过,而拒绝21端口 **(FTP)**的数据通过。
- 优化网络性能: 在负载均衡器等设备中,可以通过端口号来分配流量,从而优化网络性能。例如,将HTTP请求分配到不同的服务器上,以提高服务器的负载均衡和响应速度。
端口是用于标识不同网络应用程序的数字,其作用包括标识应用程序、区分服务类型、控制网络访问和优化网络性能等。在计算机网络中,端口的使用使得网络上的不同应用程序可以同时运行,互不干扰,从而实现了网络的多样化和高效性。
# 2.关于Socket套接字
Socket(套接字) 是计算机网络中用于实现网络通信的一种编程接口。它提供了一组函数和方法,使得应用程序能够通过网络进行数据的发送和接收。
Socket的作用是在不同主机之间建立通信连接,使得这些主机上运行的应用程序能够进行数据交换。具体来说,Socket有以下几个方面的作用:
- 建立连接:通过Socket,应用程序可以创建一个连接,将自己与远程主机上的应用程序关联起来。在客户端-服务端模型中,客户端通过Socket发起连接请求,服务端通过Socket接受连接请求,建立连接后双方可以进行数据的发送和接收。
- 数据传输:Socket提供了发送和接收数据的方法。通过Socket,应用程序可以将数据打包发送给远程主机上的应用程序,也可以从远程主机接收数据。对于TCP协议,Socket提供了可靠的、面向连接的数据传输;对于UDP协议,Socket提供了不可靠的、无连接的数据传输。
- 网络编程:Socket是进行网络编程的基础接口。通过使用Socket,开发者可以在应用程序中实现与网络相关的功能,如创建服务器、客户端,进行数据交换、文件传输等。Socket提供了一系列函数和方法,使得网络编程更加方便和灵活。
- 协议支持:Socket可以支持不同的网络协议,如TCP、UDP等。开发者可以根据需要选择合适的协议,并通过Socket进行相应的网络通信。通过Socket,应用程序可以与不同协议的主机进行通信,实现了协议的透明性和互操作性。
Socket套接字 本质是编程的API接口,是对TCP/IP的一个封装。
编程流程
注:要通过互联网进行通信,至少需要一对套接字,其中一个运行于客户端,我们称之为 Client Socket
,另一个运行于服务器端,我们称之为 Server Socket
1.服务器监听
所谓服务器监听,是指服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态 。
2.客户端请求
所谓客户端请求,是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端接字提出连接请求 。
3.连接确认
所谓连接确认,是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,就会响应客户端套接字的请求,建立一个新的线程,并把服务器端套接字的描述*** 发送给客户端。一旦客户端确认了此描述*,连接就建立好了。而服务器端套接字继续处于监听状态,接收其他客户端套接字的连接请求 。
主要类型
1.流式套接字(SOCK_STREAM)
流式套接字用于提供面向连接、可靠的数据传输服务。该服务将保证数据能够实现无差错、无重复送,并按顺序接收。流套接字之所以能够实现可靠的数据服务,原因在于其使用了传输控制协议,即
TCP(The Transmission Control Protocol)协议
。2.数据报套接字(SOCK_DGRAM)
数据报套接字提供一种无连接的服务。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。数据报套接字使用
UDP( User DatagramProtocol)协议
进行数据的传输。由于数据报套接字不能保证数据传输的可靠性,对于有可能出现的数据丢失情况,需要在程序中做相应的处理。
主要特点
根据套接字的不同类型,可以将套接字调用分为面向连接服务和无连接服务 。
面向连接服务的主要特点如下:
(1)数据传输过程必须经过建立连接、维护连接和释放连接3个阶段;
(2)在传输过程中,各分组不需要携带目的主机的地址;
(3)可靠性好,但由于协议复杂,通信效率不高 。
面向无连接服务的主要特点如下:
(1)不需要连接的各个阶段;
(2)每个分组都携带完整的目的主机地址,在系统中独立传送;
(3)由于没有顺序控制,所以接收方的分组可能出现乱序、重复和丢失现象;
(4)通信效率高,但可靠性不能确保 。
表示方法
- 套接字Socket =(IP地址:端口号),套接字的表示方法是点分十进制的lP地址后面写上端口号,中间用冒号或逗号隔开。
- 每一个传输层连接唯一地被通信两端的两个端点(即两个套接字)所确定。
- 例如:如果IP地址是210.37.145.1,而端口号是23,那么得到套接字就是(210.37.145.1:23) 。
# 3. IP地址和域名系统(DNS)
# 1.什么是IP地址
在计算机网络中,IP地址(Internet Protocol Address) 是用于在网络中唯一标识和定位设备的一个数字标识。它是互联网协议**(IP)**的核心组成部分,用于实现通过网络进行数据传输和通信。
IP地址由一串32位或128位的二进制数字组成,用于标识网络中的主机或路由器。为了方便人类理解和使用,IP地址通常以点分十进制(IPv4)或冒号分组 十六进制**(IPv6)** 的形式呈现。
IPv4地址是最常见的IP地址格式,由四个8位字段组成,每个字段用点分隔,取值范围是0~255。例如,192.168.0.1就是一个IPv4地址。IPv4地址的总数是有限的,大约为42亿个,因此IPv4地址空间已经相对紧张。
为了解决IPv4地址空间不足的问题,IPv6应运而生。IPv6地址采用128位二进制数表示,可以提供更多的地址空间。IPv6地址使用冒号分组十六进制的格式,例如2001:0db8:85a3:0000:0000:8a2e:0370:7334。IPv6地址的数量非常庞大,远远超过了IPv4地址。
IP地址的作用是用于在网络中唯一标识和定位设备。每个设备**(如计算机、路由器等)** 在网络中都必须拥有一个唯一的IP地址,这样才能准确地进行数据传输和通信。通过IP地址,数据包可以被正确地路由到目标设备。
此外,IP地址还可以用于确定设备所属的网络段。IP地址中的网络部分用于标识设备所在的网络,而主机部分则用于标识具体的设备。这样可以进行网络划分和组织,方便管理和配置网络设备。
总之,IP地址是用于在网络中唯一标识和定位设备的数字标识。它是实现网络通信和数据传输的基础,为互联网的正常运行提供了重要支持。
# 2.点分十进制表示法
我们熟悉的 IP 地址 172.16.254.1
由多个字符构成,而不是 4 个字节,这是为什么呢?为回答这个问题,我们需要深入考察 IP 地址结构,理解 点分十进制表示法 (dotted decimal notation)。
IP 地址由 4 个字节构成,但不是每个字节都能用 ASCII 来显示。下面这个 IP 地址如果用 ASCII 来解读,有 2 个字节是非法字符,另外 2 个是 ASCII 中的控制字符,没一个能直接显示:
我们知道,一个字节有 8 位,可以表示从 0 到 255 的整数。因此,一个 IP 地址可以用 4 个十进制数来表示,每个数字各代表一个字节:
我们可以用若干个 ASCII 数字字符来表示一个十进制数,每个数之间额外插入一个英文句点,进一步增强可读性,这就是我们常用的 点分十进制表示法 :
注意到,原 IP 地址中的一个字节,可能需要多个 ASCII 数字字符来表示。此外,还要插入 3 个英文句点来分隔,总长度膨胀不少。因此,点分十进制存储效率和处理效率都不高,底层网络通信还是采用原本的二进制格式。
那么,如何将点分十进制法表示的 IP 地址,换算成二进制形式呢?我们只需将每个数字都换算成 8 个二进制位,再将所有的二进制位连接起来即可:
# 3.网络号和主机号
同一个网络中的主机,IP 地址都有相同的前缀。以上节讨论的网络拓扑为例:
左边网络的主机,IP 地址前缀都是 192.168.1
;右边网络的主机,IP 地址前缀都是 192.168.2
。根据这个特性,一个 IP 地址可以分为两部分:
- 网络号 ,即公共前缀部分,用于表示一个网络;
- 主机号 ,即剩余部分,用于表示该网络内的一台主机;
这个例子中,IP 地址前 3 个字节( 24 位 )为网络号,最后一个字节( 8 位 )为主机号。主机号长度为 8 比特的网络,理论上可以接入 28=256 台主机。实际上,每个网络都有两个特殊的地址,不能分配:
- 主机号比特全为 0 ,是网络的起始地址,用于表示网络本身,一般称为 网络地址 ;
- 主机号比特全为 1 ,是网络的结束地址,用于向网络内的所有主机进行广播,一般称为 广播地址 ;
因此,一个主机号长度为 n 比特的网络,最多可以接入 2*n−2 台主机。
# 4.IP地址分类
那么,是不是所有的 IP 地址,网络号都是 3 字节,主机号都是 1 字节呢?
答案肯定是否定的。不同的网络,规模有大有小。因此,网络号和主机号的长度,需要根据网络规模来确定。试想,如果主机号总是 1 字节,当一个网络内的主机超过 254 台时,该怎么办呢?
在网络技术兴起的早期,科学家们将 IP 地址划分为若干类:
# A类地址
A 类地址第一位总是为 0 ,网络号总是 1 字节,主机号总是 3 字节,一般分配给 大型网络 。
- 前缀:
0
- 网络号可变位数:7
- 网络个数:27=128
- 每个网络支持的主机数:224−2=16777214 ,超过一千六百万;
- 地址范围:
0.0.0.0
~127.255.255.255
# B类地址
B 类地址前两位总是 10
,网络号总是 2 字节,主机号总是 2 字节,一般分配给 中型网络 。
- 前缀:
10
- 网络号可变位数:14
- 网络个数:214=16384
- 每个网络支持的主机数:216−2=65534 ,超过六万五千;
- 地址范围:
128.0.0.0
~191.255.255.255
# C类地址
C 类地址前三位总是 110
,网络号总是 3 字节,主机号总是 1 字节,一般分配给 小型网络 。
- 前缀:
110
- 网络号可变位数:21
- 网络个数:221=2097152
- 每个网络支持的主机数:28−2=254 ;
- 地址范围:
192.0.0.0
~223.255.255.255
# D类地址
D 类地址前四位总是 1110
,用于 多播通信 。
- 前缀:
1110
- 地址范围:
224.0.0.0
~239.255.255.255
# E类地址
E 类地址前四位总是 1111
,保留未用 。
- 前缀:
1111
- 地址范围:
240.0.0.0
~255.255.255.255
分类 | 前缀码 | 网络号位数 | 主机号位数 | 网络个数 | 每个网络的主机数 | 开始地址 | 结束地址 |
---|---|---|---|---|---|---|---|
A类地址 | 0 | 8 | 24 | 128 | 16777214 | 0.0.0.0 | 127.255.255.255 |
B类地址 | 10 | 16 | 16 | 16384 | 65534 | 128.0.0.0 | 191.255.255.255 |
C类地址 | 110 | 24 | 8 | 2097152 | 254 | 192.0.0.0 | 223.255.255.255 |
D类地址 | 1110 | - | - | - | - | 224.0.0.0 | 239.255.255.255 |
E类地址 | 1111 | - | - | - | - | 240.0.0.0 | 255.255.255.255 |
# 域名系统
域名系统(Domain Name System,缩写为DNS) 是互联网中用于将域名转换为对应IP地址的系统。它充当了一个分布式的命名服务,提供了将易记的域名映射到数字化的IP地址的功能。
在互联网上,每个设备都需要一个唯一的IP地址来进行通信。然而,人类更容易记住和使用易于理解的域名,例如www.example.com (opens new window),而不是一串复杂的IP地址。这就是域名系统的作用所在。
域名系统通过建立一个分层分布式数据库来实现域名与IP地址之间的映射关系。这个数据库由一组域名服务器(DNS服务器)组成,每个服务器负责管理特定的域名空间。
当用户在浏览器中输入一个域名时,操作系统会首先向本地域名服务器发送查询请求。本地域名服务器会检查自己的缓存中是否有该域名对应的IP地址,如果有则直接返回给操作系统。如果没有,则本地域名服务器会向根域名服务器发送查询请求。
根域名服务器是位于全球各地的13个服务器,它们存储了顶级域名(如.com、.org、.net等)的信息。根域名服务器会告诉本地域名服务器所查询域名对应的顶级域名服务器的地址。
本地域名服务器再向顶级域名服务器发送查询请求,顶级域名服务器会告诉本地域名服务器所查询域名对应的权威域名服务器的地址。
最后,本地域名服务器向权威域名服务器发送查询请求,权威域名服务器会返回该域名对应的IP地址给本地域名服务器,然后本地域名服务器将结果缓存并返回给操作系统。
整个过程中,域名系统通过层层查询和分布式数据库的方式,将域名转换为对应的IP地址。这样,用户只需要记住易于理解的域名,就能够访问互联网上的各种资源。
除了将域名映射到IP地址外,域名系统还可以提供其他相关信息,如邮件服务器的地址(MX记录)、子域名的映射关系(CNAME记录)等。
域名系统是当用户使用浏览器访问网址之后,使用的第一个重要协议。DNS 要解决的是域名和 IP 地址的映射问题。
在实际使用中,有一种情况下,浏览器是可以不必动用 DNS 就可以获知域名和 IP 地址的映射的。浏览器在本地会维护一个hosts
列表,一般来说浏览器要先查看要访问的域名是否在hosts
列表中,如果有的话,直接提取对应的 IP 地址记录,就好了。如果本地hosts
列表内没有域名-IP 对应记录的话,那么 DNS 就闪亮登场了。
目前 DNS 的设计采用的是分布式、层次数据库结构,DNS 是应用层协议,基于 UDP 协议之上,端口为 53 。
DNS 服务器自底向上可以依次分为以下几个层级(所有 DNS 服务器都属于以下四个类别之一):
- 根 DNS 服务器。根 DNS 服务器提供 TLD 服务器的 IP 地址。目前世界上只有 13 组根服务器,我国境内目前仍没有根服务器。
- 顶级域 DNS 服务器(TLD 服务器)。顶级域是指域名的后缀,如
com
、org
、net
和edu
等。国家也有自己的顶级域,如uk
、fr
和ca
。TLD 服务器提供了权威 DNS 服务器的 IP 地址。 - 权威 DNS 服务器。在因特网上具有公共可访问主机的每个组织机构必须提供公共可访问的 DNS 记录,这些记录将这些主机的名字映射为 IP 地址。
- 本地 DNS 服务器。每个 ISP(互联网服务提供商)都有一个自己的本地 DNS 服务器。当主机发出 DNS 请求时,该请求被发往本地 DNS 服务器,它起着代理的作用,并将该请求转发到 DNS 层次结构中。严格说来,不属于 DNS 层级结构。
# 4. TCP/UDP协议
# 1.什么是TCP
**TCP(Transmission Control Protocol)**是一种面向连接的、可靠的传输协议,用于在计算机网络中传输数据。它是互联网传输层的主要协议之一,负责提供可靠的、有序的数据传输。
TCP通过建立连接、数据分段、确认和超时重传等机制来确保数据的可靠传输。在发送数据之前,发送端与接收端需要先进行三次握手建立连接。建立连接后,数据被分割成较小的数据段,并通过序列号进行编号,然后按序发送给接收端。
接收端收到数据段后会发送确认应答,以通知发送端已经成功接收到数据。如果发送端在一定时间内没有收到确认应答,将会进行超时重传,确保数据的可靠性。
TCP通常用于对实时性要求不苛刻,但要求通讯双方传输数据完整无误的场景,例如网页浏览(HTTP/HTTPS协议)、邮件发送(SMTP协议)等。
除了可靠性和有序性,TCP还提供了双向通信的全双工特性,即发送端和接收端可以同时发送和接收数据。
TCP是一种面向连接、可靠的传输协议,用于在计算机网络中传输数据。通过连接建立、数据分段、确认和超时重传等机制,TCP确保数据的可靠传输。它还具有流量控制和拥塞控制的功能,以及全双工通信的特性。因其可靠性和广泛应用,TCP成为互联网传输层的主要协议之一。
- 面向连接:只能一对一连接,不能一对多
- 可靠:无论的网络链路中出现了怎样的链路变化,TCP 都可以保证⼀个报文⼀定能够到达接收端(依靠各种机制)
- 字节流:消息是没有数据边界的(管道也是),不管消息多大都可以传输,并且消息是有序的
# 2.什么是TCP连接
- ⽤于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括Socket、序列号和窗口大小称为连接
- 所以一个TCP连接是需要客户端和服务端达成三个信息的共识:
- Socket:IP地址 + 端口号
- 序列号:用来解决乱序问题
- 窗口大小:流量控制
# 3.TCP协议段格式
- 源/目的端口号: 表示数据是从哪个进程来, 到哪个进程去
- 32位的序列号:占4个字节,TCP是面向字节流的,所以在每一个TCP连接中传送的字节流的每一个字节都是按顺序编号,整个要传送的字节流的起始序号必须在建立时设置,通过SYN包传给接收方,
主要解决网络包乱序(去重)的问题(接收方更加关心)
- 32位的确认应答号:占4个字节,是期望收到对方下一个报文段的第一个数据字节的序号,比如说:A给B发送了一个 6 7 8,B返回的应该是 7 8 9,如果A只收到了一个9,那就说明9之前的所有数据B都已经正确收到,
主要解决不丢包的问题(发送方更关心)
- 4位首部长度(也有叫数据偏移):表示该TCP头部有多少个32位bit(有多少个4字节); 所以TCP头部最大长度是15 * 4 = 60
- 6位保留:保留为今后使用,目前应置为0
- URG(紧急:URGent):当URG = 1时,表示当前报文段中存在优先处理的数据,也叫
带外数据(OOB:out of band)
,不要按原来的排队顺序发送,会把数据紧急插入到本报文段的最前面,这时就和后面的的16位紧急指针配合使用,可以理解为一种数据的插队机制
- ACK(确认:ACKnowledegment):仅当ACK = 1时,确认号字段才有效,ACK = 0时,确认号无效
- PSH(推送:Push):提示接收端应用程序立刻从TCP缓冲区把数据读走,比如:A和B正在通信,A端的一个进程希望立刻获得B端的回应,这时A端就把PSH置为1,立即创建一个报文段发送出去,B端收到后,尽快交付给上层的进程,不需要等待缓冲区填满再向上交付
- RST(复位:Reset):RST = 1时,说明TCP连接出现了问题,必须释放连接,然后再重新建立连接,RST还可以用来拒绝一个非法的报文段或者拒绝打开一个连接,RST也可以叫做重置位
- SYN(同步:SYNchronization):在连接建立时用来同步序号,当SYN = 1,ACK = 0时,说明这是一个连接请求报文段,如果对方同意,在响应报文段中SYN = 1,ACK = 1
- FIN(完结:Finis):用来释放一个连接,当FIN = 1时,表示数据发送完毕,并要求断开连接
- 16位窗口大小:占2字节,窗口指的是发送本报文段的一方的接收窗口(而不是自己的发送窗口),窗口值会告诉对方:从现在开始,我只要多少的数据,是因为接收方的缓冲区大小是有限制的,
窗口字段明确指出了现在允许对方发送的数据里量
- 16位校验和:占2字节,发送端填充, CRC校验. 接收端校验不通过, 则认为数据有问题. 此处的检验和不光包含TCP首部, 也包含TCP数据部分
- 16位紧急指针:占2字节,紧急指针只有在URG = 1时才有意义,实际是一段偏移量,指出紧急数据的末尾在报文段的位置
# 4.TCP主要特点
- TCP是面向连接的运输层协议
- 每一条TCP连接只能由两个端点,每一条TCP连接只能是点对点的
- TCP提供可靠交付的服务,通过TCP连接传送的数据,无差错,不丢失,不重复,并且按序到达
# 5.什么是UDP
UDP(User Datagram Protocol) 是一种无连接协议,在计算机网络中用于传输短消息或数据报。它不提供可靠交付、流量控制和拥塞控制等特性,但由于其简单和高效的设计,常被用于实时性要求较高的应用。
UDP是传输层协议之一,与TCP(传输控制协议)并列成为互联网传输层的两种主要协议。与TCP不同,UDP没有建立连接的过程,发送端直接向接收端发送数据包。数据包的大小也没有限制,可以根据应用需要进行定制。
由于UDP没有建立连接的过程,所以它的开销相比TCP更小,传输速度也更快。同时,由于UDP没有可靠性保证,发送端发送的数据包有可能会丢失或到达顺序出错,因此它通常用于实时性要求较高的应用,如视频、音频等多媒体数据的传输。
另外,UDP还支持单播、广播和组播三种传输方式。其中单播是指一对一的传输方式,广播是指将数据包发送到同一网络中的所有设备,而组播是指将数据包发送到指定的一组设备。这些传输方式可以根据应用需要进行灵活的选择。
UDP通常用于对实时性要求较高的场景,如语音通信,视频通话,直播流媒体,实时多人游戏等,这些场景中,丢失一些数据包对整体效果影响不大,但是要求传输延迟较低。
# 6.UDP的协议段格式
- 目标和源端口:主要是告诉 UDP 协议应该把报文发给哪个进程
- 包长度:保存了UDP的首部长度和数据长度的和
- 校验和:校验和是为了提供可靠的UDP首部和数据,检测数据报在传输中是否有错,有错就丢弃
# 7.UDP的主要特点
- UDP是无连接的:知道对端的IP和端口号就直接进行传输, 不需要建立连接
- UDP使用尽最大努力交付(不可靠):没有确认机制, 没有重传机制; 如果因为网络故障该段无法发到对方, UDP协议层也不会给应用层返回任何错误信息
- UDP是面向数据报:不能够灵活的控制读写数据的次数和数量
- UDP没有拥塞控制(直播,视频会议等实时应用)
- UDP支持一对一,一对多,多对一,多对多的交互通信(腾讯早期使用的就是UDP)
- UDP的首部开销小,只有8字节
# 8.UDP的缓冲区
- UDP没有真正意义上的 发送缓冲区. 调用
sendto
会直接交给内核, 由内核将数据传给网络层协议进行后续的传输动作 - UDP具有接收缓冲区. 但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致; 如果缓冲区满了, 再到达的UDP数据就会被丢弃
- UDP的socket既能读也能写,全双工通信