计算机网络核心协议全解析:从MAC帧到HTTP

计算机网络核心协议全解析:从MAC帧到HTTP

一、数据链路层概述

在IP协议中会使用路由选择算法来选择路由,从而将IP报文发送到目的主机。但在路由选择之前还要解决一个问题:如何将IP报文传递到与当前路由器直接相连的下一个节点(同一个子网)。

所以跨网络传输的本质,就是将无数个局域网(子网)相连转发得到的结果。要彻底理解跨网络传输,不光要理解路由选择(怎么找到目的主机的子网),还需要理解在一个子网内的转发机制。

数据链路层的作用:用于两个设备(同一种数据链路节点)之间进行数据传递。真正在网线上传输的是MAC帧协议报文。


二、认识以太网

"以太网"不是一种具体的网络,而是一种技术标准;既包含了数据链路层的内容,也包含了一些物理层的内容。例如:规定了网络拓扑结构、访问控制方式、传输速率等。以太网中的网线必须使用双绞线;传输速率有10M、100M、1000M等。以太网是当前应用最广泛的局域网技术;和以太网并列的还有令牌环网、无线LAN等。

在同一个局域网中是可以直接通信的。局域网中的通信并不是一对一的,发送的报文在同一个局域网中的所有主机都可以收到,只不过不会处理罢了,只有目的主机才会处理报文。所以每一个主机都要有自己唯一的标识符,每张网卡都有一个唯一的MAC地址,用于标识该网卡的主机全球唯一,48位地址。

1. MAC帧协议报头格式

text 复制代码
6字节目的地址 | 6字节源地址 | 2字节类型 | 46-1500字节数据 | 4字节CRC
                       |0800    | 46-1500字节 IP数据报 |
                       |0806    | 28字节 ARP数据报(请求/响应)| 18字节PAD |
                       |0801    | 28字节 RARP数据报(请求/响应)| 18字节PAD |

数据就是整体的IP报文。

如何分离MAC帧协议报头和有效载荷?

采用定长策略:前面的14字节是MAC帧协议报头,最后的4字节是CRC校验。提取出来剩下的就是有效载荷。

如何交付给上一层?

使用2个字节的类型字段来判断:

  • 如果是0800,就是IP数据报,交付给网络层。
  • 如果是0806,就是ARP数据报,交付给ARP层。
  • 如果是0801,就是RARP数据报,交付给RARP层。

三、局域网转发原理与碰撞处理

在一个局域网里面封装好MAC帧协议报文后,这个报文在整个局域网中进行转发。每一个主机都会收到这个报文,但只有目的主机才会处理报文。每一个主机都会在自己的数据链路层进行处理,会收上报文看看我是不是目的主机(通过对比目的地址是否为自己的MAC地址)。如果是,就会处理报文;如果不是,就直接丢弃。

所以网卡会有一种模式叫做混杂模式。该模式下网卡会收到所有数据帧报文并且会交付给上一层,这个也是很多网络抓包工具的基础原理。因为MAC帧协议报文会在局域网中进行传播,所以就会有这种情况:局域网中所有主机都会发送报文,就会导致在局域网中有非常多的报文被发送到其他主机。那么就会出现数据碰撞的问题,就会出现互相干扰的情况。

所以在同一时刻,只能有一个主机发送报文,其他主机只能等待,等待当前主机发送完成后再发送报文。

我们是怎么知道发生了数据碰撞的?

因为我发送的报文也会被自己接收,所以我需要判断是否和我发送的报文是同一个报文。如果不是,就说明发生了数据碰撞。

我们又称一个局域网叫做一个碰撞域。那么我们是怎么保证在同一时刻,只有一个主机发送报文的?不同的局域网通信的标准就有不同的实现方式:

  • 其中有一种叫做令牌环传递协议来实现碰撞避免:在局域网中只有拥有令牌的主机才能发送报文。
  • 在以太网中采用的是:我发数据如果发现发生了碰撞,我就触发数据链路层的策略,暂时停止发送报文,等待其他主机发送完成后再发送报文。这种策略我们称为主机的碰撞检测和碰撞避免算法。

如何重新看待局域网?

因为在同一时刻,只能有一个主机发送报文,也就是说在同一时刻只能有一个主机在局域网中进行通信。所以我们可以把局域网看作是临界资源。碰撞检测+碰撞避免保证了同一时刻只能有一台主机能够向临界资源中写入数据(临界区),所以令牌环就类似于锁。

局域网不能很大,很大就会导致主机很多,那么发生数据碰撞的概率就会增加。所以引入了一个叫做交换机 的设备。因为在局域网进行通信的时候往往不会和所有的主机都通信,所以我们需要一个交换机来将局域网中的所有主机不都收到我的报文,而是指定的主机收到我的报文。我们把局域网看作是线性的,交换机可以把局域网中的所有主机分开。交换机左边的主机要想和交换机右边的主机交互就必须通过交换机,而在同一侧的主机就不需要交换机进行转发。所以交换机可以分割碰撞域,交换机能够识别局部性的碰撞,对应的数据就不会再向其他主机转发了。

报文长度的问题:

因为有碰撞域的存在,一台主机向另一台主机发送消息,这个消息是长了好还是短了好?答案是短了好。因为如果报文很长,发送这个报文的时间就会非常长,也就提升了这个报文发生碰撞的概率。所以MAC就有了限制报文长度的功能,最长的有效载荷的长度为1500字节。


四、对比理解MAC地址和IP地址

  • IP地址描述的是路途总体的起点和终点。
  • MAC地址描述的是路途上的每一个区间的起点和终点。

五、认识MTU

MTU相当于发快递时对包裹尺寸的限制。这个限制是不同的数据链路对应的物理层产生的限制。以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节,要在后面补填充位。最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU。

如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation)。不同的数据链路层标准的MTU是不同的。

1. MTU对IP协议的影响

由于数据链路层MTU的限制,对于较大的IP数据包要进行分包。将较大的IP包分成多个小包,并给每个小包打上标签:

  • 每个小包IP协议头的16位标识(id)都是相同的。
  • 每个小包的IP协议头的3位标志字段中,第2位置为0,表示允许分片,第3位来表示结束标记(当前是否是最后一个小包,是的话置为1,否则置为0)。
  • 到达对端时再将这些小包,会按顺序重组,拼装到一起返回给传输层。
  • 一旦这些小包中任意一个小包丢失,接收端的重组就会失败。但是IP层不会负责重新传输数据。

因为路由器是工作在网络层的,所以路上路由器节点也需要对IP数据包进行分片。因为可以限制路由器节点的MTU和限制报文不能被分片,所以路由器可能会不能接受此分片后的报文,就会直接丢弃此报文,然后上一级触发超时重传,然后重新路由选择新路径,这样就可以找到一条最大吞吐量的路径了。

2. MTU对UDP协议的影响

一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)),那么就会在网络层分成多个IP数据报。这多个IP数据报有任意一个丢失,都会引起接收端网络层重组失败。那么这就意味着,如果UDP数据报在网络层被分片,整个数据被丢失的概率就大大增加了。

3. MTU对TCP协议的影响

TCP的一个数据报也不能无限大,还是受制于MTU。TCP的单个数据报的最大消息长度,称为MSS(Max Segment Size)。TCP在建立连接的过程中,通信双方会进行MSS协商。最理想的情况下,MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的MTU)。双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值。然后双方得知对方的MSS值之后,选择较小的作为最终MSS。MSS的值就是在TCP首部的40字节变长选项中(kind=2)。

MSS的计算:

1500字节的MTU,那么IP的报头加有效载荷的长度为1500字节。有效载荷为1480字节,这个有效载荷是TCP报头加数据的长度为1480字节。减去TCP报头的20字节,这就是最大能发送1460字节的数据报。

所以TCP的滑动窗口内为什么要分有多个数据报?因为能发送的数据为拥塞窗口的大小和对方能接受的数据报的大小的较小值。如果这个最小值都是300000字节,那么就可以发送300000字节的数据报吗?显然不能。所以我们会将300000字节的数据报分成多个小的数据报,这个每次发送的数据报的大小就是1460字节,叫做MSS(Max Segment Size)最大段尺寸。


六、ARP协议

虽然在这里介绍ARP协议,但是需要强调,ARP不是一个单纯的数据链路层的协议,而是一个介于数据链路层和网络层之间的协议。但是可以认为ARP协议是一个数据链路层的协议,因为它是在数据链路层进行的,而不是在网络层进行的。

1. ARP协议的作用

ARP协议建立了主机IP地址和MAC地址的映射关系。在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址。数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃。因此在通讯前必须获得目的主机的硬件地址。所以ARP就是让路由器获取当前局域网中的所有主机的IP地址和硬件地址的映射关系。

因为我们在子网传输是通过MAC帧协议传输的,所以我们需要知道目的主机的MAC地址,所以ARP是根据IP地址来得到目的主机的硬件地址的协议。

2. ARP协议的工作流程

源主机发出ARP请求,询问"IP地址是192.168.0.1的主机的硬件地址是多少"。因为有不同的类型的MAC帧,所以会把不同的报文传给不同的协议。并将这个请求广播到本地网段(以太网帧首部的硬件地址填 FF:FF:FF:FF:FF:FF 表示广播),全部的主机都会收到这个请求。注意构建好ARP报头是先给MAC帧协议再发送子网里面的。

但是在这里不再是在MAC帧层丢弃报文,而是在ARP协议层丢弃报文。注意在ARP协议层并不是先看目的主机IP是否与本机相符,而是先看OP。因为一个主机收到的报文可能是别人发送的请求,也有可能是自己之前发送过请求别人给的应答。如果先看OP是1且目的IP不是自己的IP,则直接丢弃此报文。如果目的主机发现OP是1且目的IP是自己的IP,则直接发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中。

目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答(OP为2)数据包给源主机,将自己的硬件地址填写在应答包中。发送端填写应答方的硬件地址和IP地址,目的端填写发起主机的硬件地址和IP地址。

每台主机都维护一个ARP缓存表,可以用 arp -a 命令查看。缓存表中的表项有过期时间(一般为20分钟),如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址。ARP收到应答的时候,一般会以最新的为主,收到一个缓存就更新一个缓存。

3. ARP报头格式

text 复制代码
以太网目的地址(6字节)| 以太网源地址(6字节)| 帧类型(2字节)| 硬件类型(2字节)| 协议类型(2字节)| 硬件地址长度(1字节)| 协议地址长度(1字节)|
operation(2字节)| 发送以太网地址(6字节)| 发送IP地址(4字节)| 目标以太网地址(6字节)| 目标IP地址(4字节)|

注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。

字段说明:

  • 以太网目的地址(6字节)、以太网源地址(6字节)、帧类型(2字节):其实是MAC帧的报头,所以只会关注后面的字段。
  • 硬件类型:指链路层网络类型,1为以太网。
  • 协议类型:指要转换的地址类型,0x0800为IP地址。
  • 硬件地址长度:对于以太网地址为6字节。
  • 协议地址长度:对于IP地址为4字节。
  • OP字段:为1表示ARP请求,为2表示ARP应答。

七、其他重要协议或技术

1. DNS(Domain Name System)

DNS是一整套从域名映射到IP的系统,存在的最大价值就是便于商业化。

背景:

TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序。但是IP地址不方便记忆。于是人们发明了一种叫主机名的东西,是一个字符串,并且使用hosts文件来描述主机名和IP地址的关系。

最初,通过互联网信息中心(SRI-NIC)来管理这个hosts文件的。如果一个新计算机要接入网络,或者某个计算机IP变更,都需要到信息中心申请变更hosts文件。其他计算机也需要定期下载更新新版本的hosts文件才能正确上网。这样就太麻烦了,于是产生了DNS系统。

一个组织的系统管理机构会维护系统内每个主机的IP和主机名的对应关系。如果新计算机接入网络,将这个信息注册到数据库中。用户输入域名的时候,会自动查询DNS服务器,由DNS服务器检索数据库,得到对应的IP地址。至今,计算机上仍然保留了hosts文件。在域名解析的过程中仍然会优先查找hosts文件的内容:cat /etc/hosts。

域名简介:

主域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称。例如 www.baidu.com,域名使用 . 连接:

  • com:一级域名,表示这是一个企业域名。同级的还有 net(网络提供商)、org(非营利组织)等。
  • baidu:二级域名,公司名。
  • www:只是一种习惯用法。之前人们在使用域名时,往往命名成类似于 ftp.xxx.xxx / www.xxx.xxx 这样的格式,来表示主机支持的协议。

2. ICMP协议

ICMP协议是一个网络层协议。一个新搭建好的网络,往往需要先进行一个简单的测试,来验证网络是否畅通;但是IP协议并不提供可靠传输。如果丢包了,IP协议并不能通知传输层是否丢包以及丢包的原因。

ICMP功能:

  • 确认IP包是否成功到达目标地址。
  • 通知在发送过程中IP包被丢弃的原因。

ICMP也是基于IP协议工作的。但是它并不是传输层的功能,因此人们仍然把它归结为网络层协议。ICMP只能搭配IPv4使用。如果是IPv6的情况下,需要使用ICMPv6。


八、应用层协议详解

应用层是TCP/IP协议栈的最顶层,直接面向用户和应用程序。它负责为应用程序提供网络服务,将用户的数据转换成网络可以传输的格式。应用层协议种类繁多,下面介绍几个最常用的协议。

1. HTTP/HTTPS协议

HTTP(HyperText Transfer Protocol,超文本传输协议)是Web应用中最核心的应用层协议,基于请求-响应模型工作。客户端发送HTTP请求,服务器返回HTTP响应。

HTTP请求报文结构:

  • 请求行:包含请求方法(GET/POST/PUT/DELETE等)、请求URL、HTTP版本。
  • 请求头:包含Host、User-Agent、Content-Type、Cookie等信息。
  • 请求体:POST等请求方法携带的数据。

HTTP响应报文结构:

  • 状态行:包含HTTP版本、状态码、状态描述。
  • 响应头:包含Content-Type、Content-Length、Set-Cookie等信息。
  • 响应体:服务器返回的实际数据。

常见状态码:

  • 2xx:成功,如200 OK。
  • 3xx:重定向,如301永久重定向、302临时重定向。
  • 4xx:客户端错误,如404 Not Found。
  • 5xx:服务器错误,如500 Internal Server Error。

HTTPS与HTTP的区别:

HTTPS在HTTP的基础上增加了TLS/SSL加密层,通过证书验证服务器身份,并对传输数据进行加密,防止数据被窃听和篡改。HTTPS默认使用443端口,HTTP默认使用80端口。

2. 应用层与传输层的关系

应用层协议需要借助传输层(TCP/UDP)来传输数据:

  • HTTP/HTTPS:基于TCP,保证可靠传输。
  • DNS:主要基于UDP(端口53),因为DNS查询通常很短,UDP效率更高;当响应超过512字节时,会改用TCP。
  • FTP:基于TCP,用于文件传输。
  • SMTP/POP3/IMAP:基于TCP,用于电子邮件收发。

应用层通过端口号来区分不同的应用程序,传输层根据端口号将数据交付给正确的应用进程。

3. 应用层的工作流程

以访问一个网站为例,应用层的工作流程如下:

  1. 用户在浏览器中输入域名,浏览器调用DNS解析域名得到IP地址。
  2. 浏览器构造HTTP请求报文,交给传输层。
  3. 传输层通过TCP建立连接,将HTTP报文封装成TCP报文段。
  4. 网络层将TCP报文段封装成IP数据报,进行路由转发。
  5. 数据链路层将IP数据报封装成MAC帧,在局域网内传输。
  6. 服务器收到请求后,应用层解析HTTP报文,处理业务逻辑,返回HTTP响应。

八、面试题:浏览器中输入URL后发生的事情

这个问题分为两个部分来说:应用层和其他层。

应用层阶段:

浏览器输入URL后,首先会解析URL,拆出协议、域名、端口、路径和参数,并检查浏览器缓存、系统缓存、路由器缓存等,如果命中缓存可能直接返回;如果没有命中,就进入DNS解析阶段,把域名逐级解析成IP地址,顺序大致是:浏览器DNS缓存、系统hosts文件、本地DNS服务器、根域名服务器、顶级域名服务器、权威域名服务器,最终拿到目标服务器的IP。

接着通过传输层与服务器建立TCP连接,也就是三次握手,客户端发SYN,服务器回SYN+ACK,客户端再回ACK,如果是HTTPS还要进行TLS握手,验证证书并协商加密密钥。连接建立后,浏览器构造HTTP请求报文,包括请求行、请求头、请求体,可能携带Cookie或Token。

然后经过网络层通过IP协议寻址和路由,把数据包转发到目标网络,再经过链路层通过ARP解析MAC地址,封装成帧在局域网内传输,中间可能经过多个路由器、NAT或负载均衡。

服务器端阶段:

服务器收到请求后,可能经过反向代理和负载均衡,再交给应用服务器处理业务,比如查数据库、调用其他服务,处理完后返回HTTP响应,包括状态码、响应头和响应体。

相关推荐
Orchestrator_me1 小时前
k8s网络与应用
网络·python·kubernetes
软件工程师文艺1 小时前
PLM系统的下一个十年:从MBD模型定义到产线仿真的技术路线拆解
运维·服务器·网络
Yiran_G1 小时前
LoRa数据帧设计与工程实现:地址、长度、校验及版本兼容
网络·嵌入式硬件·物联网
IT19951 小时前
Nginx + HTTP 服务:解决响应数据包截断,返回内容不全问题
网络·网络协议·http
重生之高冷汉堡包1 小时前
Perplexity爬虫怎么做?2026常见方案对比、实操教程与问题排查
大数据·网络·爬虫·安全·ai
Brilliantwxx1 小时前
【Linux】IO(上)全篇:文件本质、C 接口、系统调用与文件描述符
linux·运维·服务器·c语言
承渊政道1 小时前
Linux网络学习【深入理解应用层HTTP协议、Cookie与Session机制及HTTPS协议原理】
linux·网络·学习·http·cookie·session
北风toto1 小时前
Linux 服务器通过 tgz 离线部署 Docker
linux·服务器·docker
重生之小比特1 小时前
【Linux系统】13 基础IO(上)
linux·运维·服务器