0 简介
TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。 TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。
1 TCP(传输控制协议)
TCP 的全称传输控制协议(Transmission Control Protocol),提供了一种面向连接的、可靠的字节流服务,大部分应用使用的是 TCP 传输层协议,比如 HTTP 应用层协议。TCP 有很多特性,比如流量控制、超时重传、拥塞控制等,这些都是为了保证数据包能可靠地传输给对方。
1.1 TCP段格式
TCP协议的数段据格式,大致如下图所示:
1.1.1 头部字段
源端口号(Source Port,16位)
源端口号表示报文的发送端口,占16位,范围0-65535。源端口和源IP地址组合起来,可以标识报文的发送地址。
目的端口号(Destination Port,16位)
目的端口号表示报文的接收端口,占16位,范围0-65535。目的端口和目的IP地址相结合,可以标识报文的接收地址。
TCP协议是基于IP协议的基础上传输的,TCP报文中的源端口号+源IP,与TCP报文中的目的端口号+目的IP一起,组合起来唯一性的确定一条TCP连接。
序列号(Sequence Number,32位)
TCP传输过程中,在发送端出的字节流中,传输报文中的数据部分的每一个字节都有它的编号。序列号占32位,发起方发送数据时,都需要标记序号。用于数据重组和丢包检测。
序列号的语义与SYN控制标志(Control Bits)的值有关。根据控制标志中的SYN是否为1,序列号表达不同的含义: (i)当SYN = 1时,当前为连接建立阶段,此时的序号为初始序号ISN(Initial Sequence Number),通过算法来随机生成序号; (ii)当SYN = 0时,SYN 包的序列号为初始序号 ISN,该包不携带数据;数据传输阶段的首个字节序号为 ISN+1,后面的报文的序号,为前一个报文的序列号值+TCP报文的净荷字节数(不包含TCP头)。比如,如果发送端发送的一个TCP帧的净荷为12byte,序号为5,则发送端接着发送的下一个数据包的时候,序号的值应该设置为5+12=17。
在数据传输过程中,TCP协议通过序号==对上层提供有序的数据流==。发送端可以用序号来==跟踪发送的数据量==;接收端可以用序号识别==出重复接收到的TCP包==,从而丢弃重复包;对于乱序的数据包,接收端也可以依靠序号对其进行==排序==。
确认序号(Acknowledgment Number,32位)
确认序号标识了报文接收端期望接收的字节序列。仅在ACK标志位为1时有效,表示期望收到的下一个字节的序列号。
举个例子,假设客户端发送3个净荷为1000byte、起始序列号序号为1的数据包给服务端。服务端每收到一个包之后,需要回复一个ACK响应确认数据包给客户端。ACK响应数据包的ACK Number值,为每个客户端包的为序列号+包净荷,既表示服务端已经确认收到的字节数,还表示期望接收到的下一个客户端发送包的序列号序号,具体的ACK值如下图左边的正常传输部分所示。
保留字段(Reserved,6位)
必须设置为0,保留供未来使用。
控制标志(Control Flags,6位)
URG:紧急指针字段有效。 ACK:确认字段有效。 PSH:接收方应尽快将数据推送给应用层。 RST:重置连接。 SYN:同步序列号,用于建立连接。 FIN:发送方完成数据发送。
窗口大小(Window Size,16位)
接收方的可用缓冲区大小,用于流量控制。
校验和(Checksum,16位)
用于检测数据传输过程中是否出现错误。校验TCP头部、数据和伪头部(IP部分字段)。
紧急指针(Urgent Pointer,16位)
仅在URG标志为1时有效,指示紧急数据的末尾位置。
选项字段(Options,可变长度)
可选字段,如最大报文段长度(MSS)、窗口缩放因子等。必须以4字节对齐,不足时用填充(Padding)。
数据部分(Payload)
包含上层协议(如HTTP、FTP)的实际数据。长度由IP数据包的总长度减去IP和TCP头部长度决定。
1.2 TCP通信过程
由于TCP需要双方建立连接,因此TCP的通信过程分为三个步骤:三次握手,传输确认,四次挥手。
1.2.1 三次握手
握手过程中使用了两个标识量:SYN
(synchronize) 和ACK
(acknowledgement) 。
过程
第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SEND
状态,等待服务器B确认。
第二次握手:服务器B收到SYN包,必须确认客户A的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV
状态。
第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=k+1),此包发送完毕,完成三次握手。
若在握手过程中某个阶段莫名中断, TCP 协议会再次以相同的顺序发送相同的数据包。
为什么需要三次握手?
如果是四次握手,需要把SYN和ACK分开发送,效率低,可以合并成一次,减少一次传输。 如果是两次握手,无法确保双方成功建立连接,可能会造成重复历史连接的初始化等问题。
例如,因为网络阻塞原因,客户端向服务器发送了两次SYN报文,旧的SYN报文先到达服务端,服务端回一个ACK+SYN报文。在三次握手的情况下,客户端收到后可以根据自身的上下文,判断这是一个历史连接(序列号过期或超时),那么客户端就会发送RST 报文给服务端,表示中止这一次连接。服务器收到RST报文,会释放连接,新的SYN报文抵达之后,客户端和服务器之间进行正常的三次握手。 如果只是两次握手,服务端在收到SYN报文之后,就进如到 ESTABLISHED 状态,服务器端并不知道这次是历史连接,直接与客户端建立连接并向客户端发送数据(造成资源浪费),但是客户端会判定这次连接是历史连接,从而发送RST报文来断开连接。
如果已经建立了连接,但是客户端突然出现故障了怎么办?
TCP还设有一个保活计时器,客户端如果出现故障,服务端不能一直等下去,这样会浪费系统资源。每收到一次客户端的数据帧后,服务端都的保活计时器会复位。计时器的超时时间通常是设置为2小时,若2小时还没有收到客户端的任何数据帧,服务端就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务端就认为客户端出了故障,接着就关闭连接。如果觉得保活计时器的2个多小时的间隔太长,可以自行调整TCP连接的保活参数。
1.2.2四次挥手
- 客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。
- 服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。
- 服务器B关闭与客户端A的连接,发送一个FIN给客户端A。
- 客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。先进行关闭的一方将执行主动关闭,而另一方被动关闭。
半双工:在节点之间点到点连接中,同一节点同一时刻只能接收或发送数据,不能同时接收、发送数据。这种同一时刻只能接收或发送数据的工作模式为半双工模式。在半双工模式下,使用CSMA/CD的机制来避免冲突。 全双工:同一时刻可以同时接收和发送数据帧。
TIME_WAIT 状态持续2 倍 MSL 时间(2MSL)。MSL(Maximum Segment Lifetime)是单个报文在网络中的最大生存时间,2MSL 用于确保双向通信的最后一个 ACK 到达对端,并避免旧连接的报文干扰新连接。具体来说,2MSL对应于一次消息的来回(一个发送和一个回复)所需的最大时间。如果直到2MSL,主动断开方都没有再一次收到对方的报文(如FIN报文),则可以推断ACK已经被对方成功接收,此时,主动断开方将最终结束自己的TCP连接。所以,TCP的TIME_WAIT状态也称为2MSL等待状态。 有关MSL的具体的时间长度,在RFC1122协议中推荐为2分钟。在SICS(瑞典计算机科学院)开发的一个小型开源的TCP/IP协议栈——LwIP开源协议栈中MSL默认为1分钟。在源自Berkeley的TCP协议栈实现中MSL默认长度为30秒。总体来说,TIME_WAIT(2MSL)等待状态的时间长度,一般维持在1-4分钟之间。
为什么需要四次挥手?
关闭连接时,客户端发送FIN报文,表示其不再发送数据,但还可以接收数据。服务端收到FIN报文,可以直接发送SYN+ACK报文。由于ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,服务端可能还要数据需要处理和发送,所以先回一个ACK应答报文,等到其不再发送数据时,才发送FIN报文给客户端表示同意关闭连接。 从上面过程可知:服务端通常需要等待完成数据的发送和处理,所以服务端的ACK和FIN一般都会分开发送,从而比三次握收导致多了一次。
为什么主动断开方在TIME-WAIT状态必须等待2MSL的时间?
-
主动断开方等待2MSL的时间,是为了确保两端都能最终关闭。假设网络是不可靠的,被动断开方发送FIN+ACK报文后,其主动方的ACK响应报文有可能丢失,这时候的被动断开方处于LAST-ACK状态的,由于收不到ACK确认被动方一直不能正常的进入CLOSED状态。在这种场景下,被动断开方会超时重传FIN+ACK断开响应报文,如果主动断开方在2MSL时间内,收到这个重传的FIN+ACK报文,会重传一次ACK报文,后再一次重新启动2MSL计时等待,这样,就能确保被动断开方能收到ACK报文,从而能确保被动方顺利进入到CLOSED状态。只有这样,双方都能够确保关闭。反过来说,如果主动断开方在发送完ACK响应报文后,不是进入TIME_WAIT状态去等待2MSL时间,而是立即释放连接,则将无法收到被动方重传的FIN+ACK报文,所以不会再发送一次ACK确认报文,此时处于LAST-ACK状态的被动断开方,无法正常进入到CLOSED状态。
-
防止旧连接的已失效的数据报文出现在新连接中。主动断开方在发送完最后一个ACK报文后,再经过2MSL,才能最终关闭和释放端口,这就意味着,相同端口的新TCP新连接,需要在2MSL的时间之后,才能够正常的建立。2MSL这段时间内,旧连接所产生的所有数据报文,都已经从网络中消失了,从而,确保了下一个新的连接中不会出现这种旧连接请求报文。
1.3 UDP
UDP 相对来说就很简单,简单到只负责发送数据包,不保证数据包是否能抵达对方,但它实时性相对更好,传输效率也高。当然,UDP 也可以实现可靠传输,把 TCP 的特性在应用层上实现就可以。
例如,实时音视频协议 RTP/RTCP 通过应用层序列号、时间戳和反馈机制实现部分可靠性,或使用 QUIC 协议(基于 UDP)实现拥塞控制和加密传输。
UDP的特点有:
- 无连接(直接开干)不需要握手和挥手,直接发送数据。比如直播时,主播直接推流,观众直接收,中间没有确认过程。
- 不保证可靠性(佛系传输)不检查数据是否到达、是否顺序正确、是否损坏。 比如视频通话中,丢几帧画面也无所谓,直接跳过继续播。
- 无流量控制(全力冲刺)发送方不会根据网络状况调整速度,能发多快发多快。适合对延迟敏感的场景(如游戏、直播)。
- 支持广播和多播(一对多撒网)UDP 可以向多个设备同时发送数据(广播或多播)。比如局域网内通过广播发现打印机;视频会议中向多个用户推送流媒体。
1.3.1 TCP与UDP的区别
表格对比如下:
特性 | TCP | UDP |
---|---|---|
连接方式 | 面向连接(三次握手) | 无连接 |
可靠性 | 可靠(重传、排序、校验) | 不可靠(尽力而为) |
传输单位 | 字节流(Segment) | 数据报(Datagram) |
流量控制 | 有(滑动窗口) | 无 |
典型应用 | HTTP、FTP、邮件 | 直播、游戏、DNS |
根本的不同点在于TCP是闭环的机制,发端会收取对端的反馈从而调整发送参数,进行闭环流量整形。而UDP是单向机制,不需要对端反馈信息。
2 IP(网际协议)
IP,全称Internet Protocol,即互联网协议,是计算机网络领域中的一个核心概念。它主要用于为网络中的每一台设备分配一个唯一的数字标识,这个标识就是IP地址。通过这个地址,设备可以在网络上被准确地定位和识别,从而实现数据的传输和共享。
2.1 IP地址的组成
IP地址由一组数字组成。对于IPv4(第四版互联网协议),它使用32位二进制数来表示,这通常被划分为四个8位(一个字节)的十进制数,各数之间用点号.
分隔。例如,常见的IPv4地址格式如192.168.1.1
。
2的32次方约等于43亿,而现在的的设备早已超过43亿,因此可以通过NAT技术使连接的设备超过43亿。
NAT(Network Address Translation),是指网络地址转换,1994年提出的。NAT是用于在本地网络中使用私有地址,在连接互联网时转而使用全局 IP 地址的技术。NAT实际上是为解决IPv4地址短缺而开发的技术。 NAT旨在通过将一个外部 IP 地址和端口映射到更大的内部 IP 地址集来转换 IP 地址。 基本上,NAT 使用流量表将流量从一个外部(主机)IP 地址和端口号路由到与网络上的终结点关联的正确内部 IP 地址。 后续会做更详细的介绍。
同时,也可以使用IPV6来解决IP不够分配的问题。IPv6(第六版互联网协议)则使用128位二进制数来表示地址,其表示方式相较于IPv4更为复杂,通常使用冒号分隔的十六进制数来表示,如2001:0db8:85a3:0000:0000:8a2e:0370:7334。
IPv6 不仅仅只是可分配的地址变多了,它还有非常多的亮点:
- IPv6 可自动配置,即使没有 DHCP 服务器也可以实现自动分配IP地址,真是便捷到即插即用啊。
- IPv6 包头包首部长度采用固定的值 40 字节,去掉了包头校验和,简化了首部结构,减轻了路由器负荷,大大提高了传输的性能。
- IPv6 有应对伪造 IP 地址的网络安全功能以及防止线路窃听的功能,大大提升了安全性。
IPV4与IPV6的对比如下表所示:
特性 | IPv4 | IPv6 |
---|---|---|
地址长度 | 32 位(约 43 亿地址) | 128 位((2^{128})地址) |
头部结构 | 可变长(20-60 字节) | 固定长 40 字节,简化字段 |
自动配置 | 依赖 DHCP | 支持无状态自动配置(SLAAC) |
安全性 | 需额外协议(如 IPsec) | 内置 IPsec,支持加密和认证 |
多播 | 支持有限原生 | 支持任意播(Anycast) |
2.2 协议报文
以下是一个关于IP协议(以IPv4为例)的展示:
字段名称 | 字段长度(bit) | 描述 |
---|---|---|
版本号(Version) | 4 | 指定IP协议的版本,IPv4为4 |
首部长度(Internet Header Length, IHL) | 4 | IP头部的长度,以4字节为单位,取值范围为5-15(即20-60字节) |
服务类型(Type of Service, TOS) | 8 | 包括优先权(已弃用)、延迟、吞吐量、可靠性和花费等子字段,声明数据报被网络系统传输时可以被怎样处理 |
总长度(Total Length) | 16 | 整个IP报文的总长度(包括头部和数据),以字节为单位,最大长度为65535字节 |
标识(Identification) | 16 | 用于标识一组属于同一数据包的分片,在组装时,相同标识的放到一起组装 |
标志(Flags) | 3 | 包括是否分片、禁止分片、更多分片等子字段 |
片偏移(Fragment Offset) | 13 | 描述分片相对于原始IP报文开始处的偏移,以8字节为单位 |
生存时间(Time to Live, TTL) | 8 | 数据报到达目的地的最大报文跳数,每经过一个路由器转发,TTL值减1,减到0时数据报被丢弃 |
协议(Protocol) | 8 | 表示上层协议的类型,如ICMP(1)、IGMP(2)、TCP(6)、UDP(17)等 |
头部校验和(Header Checksum) | 16 | 使用CRC进行校验,鉴别头部是否损坏,只校验IP的首部,载荷中的TCP/UDP都自带校验 |
源地址(Source Address) | 32 | 发送端IP地址 |
目标地址(Destination Address) | 32 | 接收端IP地址 |
可选项(Options, 可变长度) | 32的整数倍 | 定义一些任选项,如记录路径、时间戳等,长度可变,但必须是32比特的整数倍,不足时需填充0 |
2.3 IP的分类
IP 地址分类成了 5 种类型,分别是 A 类、B 类、C 类、D 类、E 类。
A类IP地址
由1字节的网络地址和3字节主机地址组成,网络地址的最高位必须是“0”。 可用的A类网络有126(2^7^-2)个,地址范围从1.0.0.0到126.255.255.255,每个网络能容纳1亿多(2^24^-2)个主机。
其中: 0.0.0.0/8 是保留地址(未指定网络); 127.0.0.0/8 是回环地址(本地测试); 特殊地址: 127.0.0.1表示主机本身,用于本地机器的测试。
默认子网掩码:255.0.0.0。 A类IP地址一般用于大型网络。
B类IP地址
由2个字节的网络地址和2个字节的主机地址组成,网络地址的最高位必须是“10”。 可用的B类网络有16384(2^14^-2)个,地址范围从128.0.0.0到191.255.255.255,每个网络能容纳(2^16^-2)个主机。
其中: 128.0.0.0/16 是保留网络(全 0 主机号); 191.255.0.0/16 是广播地址(全 1 主机号);
默认子网掩码:255.255.0.0。 B类IP地址一般用于中等规模网络,如大学、科研所等。
C类IP地址
由3字节的网络地址和1字节的主机地址组成,网络地址的最高位必须是“110”。 C类网络可达2097152(2^21^-2)个,地址范围从192.0.0.0到223.255.255.255,每个网络能容纳254(2^8^-2)个主机。
其中: 192.0.0.0/24 是保留网络; 223.255.255.0/24 是广播地址;
默认子网掩码:255.255.255.0。 C类IP地址一般用于小型网络,如公司、家庭网络(wifi)。
D类IP地址
无网络号和主机号之分,IP地址最前面为“1110”(二进制)。 地址范围从224.0.0.0到239.255.255.255。 D类地址作为组播地址(一对多的通信),用于多点广播(Multicast)。多点广播地址用来一次寻址一组计算机,它标识共享同一协议的一组计算机。
E类IP地址
无网络号和主机号之分,IP地址最前面为“1111”(二进制)。 地址范围从240.0.0.0到255.255.255.255。 E类地址为保留地址,供以后使用,通常用于科学研究。
其他特殊类型的IP地址: 全零地址:“0.0.0.0”地址对应于当前主机。 全1地址:“255.255.255.255”是当前子网的广播地址。 私有地址(专用地址):不会在全球使用,只具有本地意义。包括A类私有地址10.0.0.0/8(范围是10.0.0.0-10.255.255.255),B类私有地址172.16.0.0/12(范围是172.16.0.0-172.31.255.255),C类私有地址192.168.0.0/16(范围是192.168.0.0-192.168.255.255)。
2.4 子网掩码
子网掩码是一个32位地址(对于IPv4),用于屏蔽IP地址的一部分,以区分网络标识(网络地址)和主机标识(主机地址)。它必须与IP地址一起使用,不能单独存在。
2.4.1 主要功能
- 区分网络地址和主机地址:通过子网掩码,可以将IP地址划分为网络部分和主机部分,从而确定设备所在的网络以及该网络中的具体位置。
- 提高IP地址分配效率:子网掩码允许将一个大的网络划分为多个小的子网,从而更有效地利用IP地址资源,减少浪费。
- 支持路由决策:路由器使用子网掩码来确定数据包的目标网络,并根据路由表进行转发,从而确保数据包能够正确地到达目的地。
2.4.2 表示方法
子网掩码通常有两种表示方法:
- 点分十进制表示法:将32位的子网掩码划分为四个8位(一个字节)的十进制数,并用点号(.)分隔。例如,255.255.255.0。
- CIDR表示法:使用斜杠(/)后跟一个数字来表示子网掩码中网络位的长度(即二进制数字“1”的个数)。例如,/24表示子网掩码为255.255.255.0。
2.4.3 子网掩码与IP地址的关系
子网掩码与IP地址一起使用,将32位的子网掩码与32位的IP地址进行按位与运算。运算结果即为网络地址,它表示了设备所在的网络。
3 四层模型
TCP/IP 网络通常是由上到下分成 4 层:应用层,传输层,网络层和网络接口层。TCP/IP协议族按照层次由上到下,层层包装。
相对于OSI模型,TCP/IP的四层模型简化了一下,对比如图所示:
OSI(Open System Interconnect),即开放式系统互连。 一般都叫OSI参考模型,是ISO组织在1985年研究的网络互连模型。该体系结构标准定义了网络互连的七层框架。
各层封装关系如下所示:
应用层数据 → 传输层(TCP/UDP头部) → 网络层(IP头部) → 网络接口层(MAC头部+物理层比特流)
当应用数据向下传递时,每一层都会添加本层协议头部,形成层层封装
;接收方则从下至上逐层剥离头部,实现解封装
。
我们从上往下,一层层来看。
3.1 应用层
应用层是TCP/IP协议的第一层,是直接为应用进程提供服务的,比如 HTTP、FTP、Telnet、DNS、SMTP等。 应用层不去关心数据是如何传输的。就类似于,我们寄快递的时候,只需要把包裹交给快递员,由他负责运输快递,我们不需要关心快递是如何被运输的。 当两个不同设备的应用需要通信的时候,应用就把应用数据传给下一层,也就是传输层。 应用层是工作在操作系统中的用户态,传输层及以下则工作在内核态。
3.2 传输层
传输层(Transport Layer)主要负责实现端到端(End-to-End)的通信,确保数据在应用程序之间的可靠、高效传输。
在传输层会有两个传输协议,分别是 TCP 和 UDP。
TCP协议就像是打电话给对方,在这一系列流程都能得到及时反馈,并能确保对方及时接收到。 UDP协议就像是写信给对方,寄出去信件之后不知道对方是否收到信件,信件内容是否完整,不能得到及时反馈。
TCP段
应用需要传输的数据可能会非常大,如果直接传输就不好控制,因此当传输层的数据包大小超过 MSS(TCP 最大报文段长度) ,就要将数据包分块,这样即使中途有一个分块丢失或损坏了,只需要重新发送这一个分块,而不用重新发送整个数据包。在 TCP 协议中,我们把每个分块称为一个 TCP 段(TCP Segment)。
当设备作为接收方时,传输层则要负责把数据包传给应用,但是一台设备上可能会有很多应用在接收或者传输数据,因此需要用一个编号将应用区分开来,这个编号就是端口。 比如 80 端口通常是 Web 服务器用的,22 端口通常是远程登录服务器用的。而对于浏览器(客户端)中的每个标签栏都是一个独立的进程,操作系统会为这些进程分配临时的端口号。 由于传输层的报文中会携带端口号,因此接收方可以识别出该报文是发送给哪个应用。
3.3 网络层
网络层在TCP/IP协议中的位于第三层,主要负责网络连接的建立和终止以及IP地址的寻找等。
实际场景中的网络环节是错综复杂的,中间有各种各样的线路和分叉路口,如果一个设备的数据要传输给另一个设备,就需要在各种各样的路径和节点进行选择,而传输层的设计理念是简单、高效、专注,如果传输层还负责这一块功能就有点违背设计原则了。
也就是说,我们不希望传输层协议处理太多的事情,只需要服务好应用即可,让其作为应用间数据传输的媒介,帮助实现应用到应用的通信,而实际的传输功能就交给下一层,也就是网络层(Internet Layer)。
网络层最常使用的是 IP 协议(Internet Protocol),IP 协议会将传输层的报文作为数据部分,再加上 IP 包头组装成 IP 报文,如果 IP 报文大小超过 MTU(以太网中一般为 1500 字节)就会再次进行分片,得到一个即将发送到网络的 IP 报文。
TCP 根据 MSS(最大段大小)分段,IP 根据 MTU(最大传输单元)分片。 TCP 分段发生在传输层,目的是适配 IP 层的 MTU; IP 分片发生在网络层,若 IP 包超过链路 MTU(如以太网 1500 字节),会被拆分为多个分片,需在接收端重组。 【注】IP 分片会增加传输延迟和丢包风险(若一个分片丢失,整个数据报需重传)。现代网络通过 MTU 发现机制(Path MTU Discovery)动态调整传输单元,尽量避免分片。TCP 通过 MSS 设置主动适配 MTU,进一步减少 IP 分片的需求。
网络层负责将数据从一个设备传输到另一个设备,世界上那么多设备,又该如何找到对方呢?因此,网络层需要有区分设备的编号。 我们一般用 IP 地址给设备进行编号,对于 IPv4 协议, IP 地址共 32 位,分成了四段(比如,192.168.100.1),每段是 8 位。只有一个单纯的 IP 地址虽然做到了区分设备,但是寻址起来就特别麻烦,全世界那么多台设备,难道一个一个去匹配?这显然不科学。 因此,需要将 IP 地址分成两种意义:
- 一个是网络号,负责标识该 IP 地址是属于哪个「子网」的;
- 一个是主机号,负责标识同一「子网」下的不同主机;
因此需要配合子网掩码才能算出 IP 地址 的网络号和主机号。
举个例子,比如 10.100.122.0/24,后面的/24表示就是 255.255.255.0 子网掩码,255.255.255.0 二进制是11111111-11111111-11111111-00000000,为了简化子网掩码的表示,用/24代替255.255.255.0。
IP地址:10.100.122.2 → 二进制:00001010.01100100.01111010.00000010
子网掩码:255.255.255.0 → 二进制:11111111.11111111.11111111.00000000
------------------------ 按位与运算 -----------------------------------
网络号:10.100.122.0 → 二进制:00001010.01100100.01111010.00000000
将 255.255.255.0 取反后与IP地址进行进行按位与运算,就可以得到主机号。
在寻址的过程中,先匹配到相同的网络号(表示要找到同一个子网),才会去找对应的主机。
除了寻址能力, IP 协议还有另一个重要的能力就是路由。实际场景中,两台设备并不是用一条网线连接起来的,而是通过很多网关、路由器、交换机等众多网络设备连接起来的,那么就会形成很多条网络的路径,因此当数据包到达一个网络节点,就需要通过路由算法决定下一步走哪条路径。 路由器寻址工作中,就是要找到目标地址的子网,找到后进而把数据包转发给对应的网络内。 所以,IP 协议的寻址作用是告诉我们去往下一个目的地该朝哪个方向走,路由则是根据 下一个目的地 选择路径。寻址更像在导航,路由更像在操作方向盘。
3.4 网络接口层
在TCP/IP协议中,网络接口层位于第四层。网络接口层涵盖数据链路层和物理层,负责物理介质上的比特流传输和帧处理。所以,网络接口层既是传输数据的物理媒介,也可以为网络层提供一条准确无误的线路。 在生成了 IP 头部之后,接下来要交给网络接口层(Link Layer)在 IP 头部的前面加上 MAC 头部,并封装成数据帧(Data frame)发送到网络上。
MAC地址,全称为媒体访问控制地址(Media Access Control Address),是一种用于网络通信的唯一标识符。它是由IEEE 802标准定义的,用于在局域网(LAN)和城域网(MAN)中识别网络设备。MAC地址通常由12位十六进制数字组成,分为6个字节,每个字节由两个十六进制数字表示,例如:00-1A-2B-3C-4D-5E。 MAC 地址在设计上由 IEEE 保证全球唯一性,每个网络设备在生产时都会被分配一个唯一的MAC地址。这种唯一性确保了在网络中不会出现地址冲突,从而保证了网络通信的顺畅。MAC地址通常被烧录在网络设备的硬件上,如网卡、路由器、交换机等。 当一个设备需要发送数据时,它会使用目标设备的MAC地址作为目的地址,以确保数据能够正确地发送到目标设备。同时,接收设备也会根据MAC地址来判断数据是否是发送给自己的,从而决定是否接收该数据。 此外,MAC地址还与IP地址相互配合,共同完成网络通信。IP地址用于在互联网上标识设备的位置,而MAC地址则用于在局域网内标识设备。当数据在局域网内传输时,主要依赖MAC地址进行寻址;而当数据需要跨越不同网络时,IP地址则起到了关键作用。通过ARP(地址解析协议),可以将IP地址解析为MAC地址,从而实现不同网络之间的通信。
IP 头部中的接收方 IP 地址表示网络包的目的地,通过这个地址我们就可以判断要将包发到哪里,但在以太网的世界中,这个思路是行不通的。
以太网是一种计算机局域网技术。IEEE组织的IEEE 802.3标准制定了以太网的技术标准,它规定了包括物理层的连线、电子信号和介质访问层协议的内容。以太网是目前应用最普遍的局域网技术,取代了其他局域网技术如令牌环、FDDI和ARCNET。
在网络中,计算机使用传输介质(例如网线)进行连接,网络数据通过传输介质进行传输来完成整个通信。 以太网在判断网络包目的地时和 IP 的方式不同,因此必须采用相匹配的方式才能在以太网中将包发往目的地,而 MAC 头部就是干这个用的,所以,在以太网进行通讯要用到 MAC 地址。 所以说,网络接口层主要为网络层提供「链路级别」传输的服务,负责在以太网、WiFi 这样的底层网络上发送原始数据包,工作在网卡这个层次,使用 MAC 地址来标识网络上的设备。