1、OSI七层协议

1、路由器与交换机工作原理

路由器是什么

它是连接不同网络的设备,负责在不同网络(不同局域网)之间转发数据包;(而交换机是在同一局域网的内部转发);

假设一台主机A要连接一台主机B;主机A的IP是192.168.1.2;主机B的IP是10.0.0.2;根据IP地址知道它们属于不同网段;这时候就需要走路由器(用路由器);

路由转发的过程(四个阶段)

1>源主机封装:

封装与决策:路由转发的起点是从主机开始的(主机A),而不是路由器;当主机A的 应用层产生数据,经过TCP封装IP封装后生成一个IP报文:源IP是A的IP,目标IP是B的IP;这时主机A的网络协议栈会进行第一次路由决策:它会把自己的子网掩码和自己的IP相与得到网段,与目的IP10.0.0.2进行比较是否处于同一网段;发现不在;于是协议栈就知道它的数据包不能发给B主机,得发给我的默认网关(路由器);假设路由器与主机A的连接的接口IP是192.168.1.1;

主机A要发数据给网关,它知道网关的IP,但数据链路层传输的是MAC地址,主机A怎么得到网关的MAC地址;就用到ARP协议:主机A查到自己的ARP缓存表;有没有192.168.1.1对应的MAC地址,如果有,就直接用,如果没有,主机A会广播发送一个ARP request;询问谁是192.168.1.1,请告诉我你的MAC;网关收到广播后,单播回复自己的MAC地址,拿到网关的MAC后,主机A完成二层帧的封装,

2>路由器入站

入站处理:数据包顺着网线飞到路由器的入接口,路由器会先检查二层帧头的FCS(帧校验序列),确保传输没出错,如果出错,直接丢弃包,接着检查帧的目的MAC地址,确认是自己的接口MAC地址后便把二层帧头剥掉,把里面的IP报文提取出来,这个步骤叫解封装;此时路由器手里拿到了原始的IP报文;路由器会桌几个检查:1.检查IP头部的校验和,确保IP头没损坏,2.检查TTL值(time to live的缩写,数据报的生存时间);每经过一台路由器TTL必须-1;路由器会观察-1之后TTL是否变为0;如果变为0了;说明这个包在网络里待太久了;为了防止环路风暴;路由器会丢弃这个包,并向源主机发生一个ICMP超时差错报文

3>查路由表

如果TTL大于0;就继续下一步——就查路由表;路由器需要根据目的IP10.0.0.2决定从哪个接口包包送出去,以及送给谁(路由表是存储在路由器内存中的一张决策表;每一条路由条目都包含了几个核心信息:1.目的网络:指明一个IP地址范围如:192.168.1.0/24;2.下一跳 指出为了达到目的网络,数据包应该被传递给的下一个路由器的IP地址 3.出接口 指明数据包应该从路由自身的哪个物理接口发送出去);在路由表中路由器执行最长匹配原则;)最长匹配原则:选子网掩码最长的IP;因为掩码越长;网络范围越小,路由越精确

通过查路由表,路由器可以得到两个关键信息:1.出接口;2.下一跳IP;如果目的IP就在直连网段,下一跳就是目的IP本身;如果还需中转,下一跳就是下一个路由器的接口IP

4>封装转发

查到出接口,还不能转发,在转发之前路由器会对IP数据包头部进行两项必要修改:1.TTL-1;TTL生存时间字段:用于防止数据包在网络中无限循环;每经过一台路由器TTL值就减1;如果TTL值减到0,路由器就丢弃该数据包,并通常向源地址发送一个超时消息;2.重新计算头部校验和;由于TTL字段已被改变,IP头部的校验和必须随之更新;接着,路由器进行重新封装,数据包要离开路由器必须重新重新穿上二层的衣服(重新封装帧头);IP包每经过一个路由器源MAC和目的MAC都会变,路由器的出接口MAC变成新的源MAC,目的MAC不一定是最终主机B的MAC;如果路由器直接连接主机B,那目的MAC就是主机B,如果路由器后面还有路由器,那目的MAC就是下一个路由器的入接口MAC,完成二层封装后,路由器将新的数据帧放入出接口的发送队列,最终通过物理链路传输出去;数据包便离开了这个路由器前往路径上的下一个节点;至此路由器的整个路由转发流程完成

路由表是如果产生?

三个来源:

1.直连路由:路由器接口配置IP并启用后自动生成的路由对应接口所在的网段;如LAN口...

2.静态路由:网络管理员手动添加的路由条目适合小型、拓扑固定的网络;

3.动态路由:路由器同过动态路由协议,如OSPF、BGP、RIP和其他路由器交换路由信息自动生成的路由,如OSPF适合企业内网,BGP适合互联网骨干网,能自动适应网络拓扑变化,如某条链路断了,自动切换到备用路径,适合大型复制网络

1、OSI七层协议模型(理想化网络协议)

1.物理层:原始比特流的传输(比特bit)

(1)提供传输数据的物理通路

(2)传输数据

2.数据链路层:建立相邻节点数据链路传输;将比特流封装成帧进行差错检测和流量控制(传输单位:帧)

提供可靠的点对点数据传输

(1)数据链路的建立、维护、拆除、制定拓扑结构并提供提供硬件寻址

(2)数据组帧

(3)控制帧的搜发顺序

(4)差错检测与恢复,流量控制

主要设备:二层交换机、网桥

3、网络层:基于IP地址的路由选路传输数据(数据包packet)

(1)路由选择(路由选路)

(2)拥塞控制、差错检测与恢复

(3)网络互联

主要设备:路由器

4、传输层:常规数据传输,面向连接或无连接(数据段segment)

提供端到端(进程间)的可靠或不可靠传输,确保数据完整性和顺序

(1)流量控制

5、会话层Session layer:建立会话关系

6、表示层: 数据传输格式转换(统一)

(1)数据的加密解密

(2)数据的压缩与解压缩

7、应用层:面向用户,为用户应用程序提供服务接口和网络接口

OSI四层协议(标准网络协议族)

物数网传应

总结:

1、物理层0/1比特流传输(网线、WIFI)

2、数据链路层:封装帧,MAC寻址(交换机)

3、网络层:IP寻址,路由选择(路由器)

4、传输层:TCP/UDP,端到端传输

5、会话层:管理连接(TLS/SSL)

6、表示层:数据加密/压缩(JPEG、Unicode)

7、应用层:用户直接使用的服务(HTTP、DNS)

会话层的作用:建立会话与断开会话,是逻辑上的对话,只管会话流程,不搬运数据;实际的传输信息是底层的传输层做的事(它就是搬运数据)

数据链路层的差错检测是仅覆盖相邻设备的一段直连链路不出错,只管当前网线/光纤这一小段;它(可靠性)只适用于两台设备之间的信息传输,跨路由就失效了,

而传输层是保证端对端的全称可靠,跨越整个互联网多端链路,从电脑到服务器全程兜底;通过出错重传,把网线路线出错丢包的情况TCP也能通过重传把数据补回来(只重传丢失损坏的那一段);二层链路负责路线比特错误,本地直接丢弃坏帧,这是第一道方向;而四层的TCP是做最后的收尾工作,做补救措施;分工,有先后顺序;善后的作用

传输层的分段(发送)与重组(接收):一个大块字节流分成小段,每个字节分配全局序列号封装TCP头部发走;重组:接收分段,根据序列号定位数据位置,缓存乱序分段、丢弃重复段,凑齐连续字节后拼接成完整数据流交付给上层应用

传输层的端到端传输:端到端指的是全称,从首到尾的意思;从开始发送到接收数据的整个过程(从发送应用程序直达接收应用程序;进程到进程

三次握手四层挥手的SYN、FIN标准为有特殊规则:即使报文不带数据,也会占用1个序列号,并且是依次编号,用一个加一个

  1. 第一次握手(客户端 → 服务端 SYN) 客户端随机生成初始序列号 x TCP 头部:seq = x,标志位 SYN=1 作用:申请建立连接,同步客户端起始序号;这个 SYN 消耗序号 x。

  2. 第二次握手(服务端 → 客户端 SYN+ACK) 服务端随机生成自身初始序列号 y TCP 头部:seq = yack = x + 1,标志位 SYN=1, ACK=1

  • ack=x+1:告知客户端,我已经收到你的 SYN,下一个期待接收的字节序号是 x+1
  • SYN 同样消耗序号 y
  1. 第三次握手(客户端 → 服务端 ACK) TCP 头部:seq = x + 1ack = y + 1,标志位 ACK=1
  • ack=y+1:告知服务端,你的 SYN 我收到了,期待下一字节 y+1
  • 单纯 ACK 报文、无数据、无 SYN/FIN,不占用新序列号

网络层:控制数据的路由(找路)与转发(送包);

什么是路由:计算路径的过程:通过路由算法,算出从本机到目标IP完整的一条通路生成一张路由表,这个计算、学习路径的过程叫路由;路由就是“找路”;转发是"找好的路送包";

路由表中包含每个目标地址对应的出口、下一跳IP;

物理层:负责比特流传输(0和1信号序列的传输,它不是二进制),定义物理介质的连接特性(同一接口、电压、速率):定义光怎么表示0和1,高低电平表示0和1;物理层就是统一物理介质标准的,1.电气标准的统一,比如规定只能用3.3.V代表1,而3.5V就不能代表1 ;2.机械规格的统一:RJ45水晶头8针,而其他的4针的非标接口就插不上3.传输速率的一直,规定都只能是1000M传,而路由器10M就不行;物理层它有自动速率协商机制(物理层标准自带);就会偏向其中一方的硬件速率,如协商完成,电脑网卡主动放慢电平切换速度和10M的路由器同步

应用层:是提供用户接口和网络服务的一层;提供用户接口:提供人与电脑交互的入口:有图形界面、命令行操作界面;还有提供网络服务:网络服务是面向服务器与客户端程序:依靠HTTP、DNS、FTP等协议,规定了两台软件怎么对话

2、四层协议使用到的协议有哪些

3、三次握手的原理

三次握手

SYN:(synchronize)同步序列号的标志位,置为1代表同步了自己的序列号给对方

ACK:(acknowledgement)确认数据收到的标志位,置为1代表自己收到数据,回应给对方

seq:本报文段的序列号;客户端发包->seq = 客户端的ISN ;服务器发包->seq =服务器的ISN;seq+1代表从服务器收到SYN后,下一次等客户端从ISN_C+1的位置发送数据

ack:确认号

listen设置被动套接字是让别人连接它,如果不listen,套接字就默认是主动的,它只能connect去连接别人(去跟别人打,不能接电话);listen就是设置被动状态等着别人联系它;就能运行外部客户端发来连接请求;

4、交换机与路由器的工作原理

什么是交换机

交换机是一种基于MAC地址识别,能够完成封装转发数据包功能的网络设备;

路由器工作原理

路由器工作在OSI三层(网络层),依靠IP地址寻址;而交换机在二层;每个物理接口对应一个独立IP网段、独立广播域,广播包不会跨接口转发

工作原理:路由器根据路由表,选择最佳路径转发数据包,实现不同网络间的通信

数据包发哦那个流程:

1.主机判断目标IP是否在同一个网段,若不在则发送给默认网关(路由器)

2.路由器收到数据包,根据目标IP查找路由表,选择下一跳

3.将数据包转发到下一跳路由器,重复步骤2,直到到达目标网络

4.目标路由器将数据包转发给目标主机

路由器访问百度

1.将百度的网站域名解析成IP地址;用DNS;

2.判断百度的IP与自己的(主机)IP是不是处于同一网段,不是;我们主机就要把数据包发送给网关,也就是发给路由器(网关路由器);把数据包中的对方MAC地址(二层帧头的目的MAC)填写成路由器的MAC地址;

下一跳:(跨网段上网时的下一站是路由器(家用路由器),就填路由器MAC;内网互访时下一站是另一台电脑,就填对方电脑MAC)

3.我们发现百度是外网地址,使用NAT网络地址端口映射将自己的IP转换成公网(错);将数据包的源IP与源端口映射成一个新的端口,保存在路由器的端口映射表中;再将映射后的端口填写到源端口上(主机内网端口),将路由器的公网IP填写到源IP上

NAT做两件事:

1>将内网IP改成路由器的公网IP,使百度看不到自己的内网地址,2>端口号换成新端口号;记录到映射表:例如内网192.168.1.100:50000 <-> 223.112.x.x:61000

什么时候源IP从主机内网IP换成路由器公网IP的?

切换发生在路由器LAN口接收数据包、剥离二层帧头之后,转发到WAN口之前,也就是NAT地址转换步骤:在NAT映射后就修改源IP为路由器公网IP,源端口替换成新分配的公网端口

4.紧接着通过查路由表,找到自己(这个家用路由器——出口路由)与百度服务器最近的路由器(又一个路由器;运营商的路由器)(不是找最近的IP);就进入了运营商骨干网络;                                               

数据包的目的MAC改为此路由器的MAC地址,也就是下一跳的MAC地址,源MAC改为自己(当前)路由器的MAC,将此数据包转发给下一个路由器

5.后面的路由器也都查询自己的路由表,转发给下一个路由器(依照步骤4的操作),直到发送到百度服务器;到达百度服务器就准备返回

6.百度回发的数据包最终回到自己的路由器上,此时百度回的数据包目标IP写的是路由器公网IP,目标端口是映射后的的端口(还是使用原来映射的端口,),目标MAC是路由器的MAC地址

7.路由器收到此数据包后查询自己的端口映射表(NAT)将目标IP改为主机的内网IP目标端口(61000)改为主机端口(50000),目标MAC也改为主机的MAC地址,再将此数据包发送给主机。一去一回才是建立连接,与百度建立连接之后再通过原路返回(原来对应的访问路径的逆过程,还是之前的映射)

网关是一个逻辑角色,它不是单独设备:

它的定义(就是一个IP):本机网段的出口,本机访问非本网段IP时,唯一要把包发给的那台设备IP(电脑访问外网的唯一出口);承担网关这个角色的设备,只能是路由器;

什么是网关路由器

路由器同时承担两种身份

1.它是一台路由器(有LAN口内网口、WAN外网口,能转发跨网段数据);

2.它是你的电脑的默认网关(网络访问外网的唯一出口)

网关路由器即是充当内网默认网关的那台路由器

为什么判断目标IP不是内网,就要发给网关路由表

本机路由表的规则:所有非本网段流量,统一转发非默认网关;

默认网关IP是路由器LAN口地址,电脑通过ARP拿到路由器的MAC地址;

把数据包的二层帧里的目的MAC写成路由器的MAC地址,数据包发给这台同时作为网关的路由器

逻辑:内网设备自己不能直接访问外网,没有跨公网转发能力;

唯一能帮它转发外网数据包的设备就是这个兼任网关的路由器

WAN口与LAN口的区别(为什么网关不能使用WAN而使用LAN口)

1.LAN口(内网口):连接的设备是使用局域网网段

WAN口(外网口):连接光猫/运营商,使用的是运营商公网;与自己的主机不在同一个网段

2.主机与WAN口不在同一个网段,主机无法直连通信

主机没办法通过ARP获取WAN口的MAC,根本发不出数据包给WAN口;因为LAN口IP与主机同段,ARP就可以解析查到MAC地址,数据包才能送达

3.默认网关是内网出口地址,只对内网设备生效

默认网关的定义:本网段内,所有跨网段流量的转发出口IP,它必须是当前局域网内可达的IP

可达:统一局域网,直连通信

不可达(需要中转的情况):跨网段,必须通过网关转发


 

5、编写服务器与客户端框架代码的编写(只写函数名)

TCP

服务器

1.socket被动打开状态

2.bind绑定端口号

3.listen设置套接字为被动监听模式,这个模式只能接收被动连接;(而未listen的普通socket则可以通过connect发起主动连接)

4.accept阻塞等待客户端连接

5.read/recv;write/send;读数据接收消息;写数据发送消息

6.close关闭套接字

客户端

1.socket

2.connect主动连接套接字

3.read/recv;write/send;收发数据

4.close关闭套接字

为什么服务器需要绑定,客户端不需要绑定?

服务端:被动打开,必须固定端口,供客户端连接

客户端:主动打开,系统主动分配临时端口;手动bind可能发生冲突(端口被占用)

服务器必须bind:提供固定地址,让别人找到

客户端不bind:主动连接别人,系统自动分配临时端口;打电话给别人,不需要知道自己的地址

6、select、poll、epoll三中IO复用的函数有什么异同点

IO复用的三种方法 select poll epoll
共同点 属于IO复用IO,遍历所有的fd,O(n);管理多个文件描述符,轮询检查FD,根据文件描述符状态进行对应的处理
不同点 没有文件描述符的数量限制,但文件描述符数量过大也会影响性能(性能下降) 性能比poll更优,仅关注活跃的文件描述符,由事件进行驱动,不去遍历所有的文件描述符,O(1),内置红黑树,快速增删改查,返回就绪的fd,同样没有fd的数量限制,不用全局扫描,仅受资源的约束
特性

perror("select");等价与

printf("select:%sn\",strerror(errno))

epoll多路复用--串讲

7、五种IO分别是什么?哪些是同步IO,并说明情况

概念:

同步:按顺序执行的操作,依次,不能同时

异步:没有顺序,没有先后,而且还可以同时进行

同步IO与异步IO

请求引起阻塞的操作是同步IO

未引起阻塞的IO是异步IO

会阻塞的IO(5种中判断)

阻塞IO:同步IO;进程发起系统调用后就一直阻塞(线程原地等),直到数据从内核复制到用户空间完成才返回(recv()会一直阻塞直到数据到达);recv()/read()返回一个大于0 的整数,就代表拷贝成功,并且字节数就是这个返回值大小;返回-1是发送错误

原地等待 = 线程阻塞休眠

拿到数据才走 = 函数返回

非阻塞IO:调用recv()立即返回,数据未就绪则返回错误(没数据,进程不会卡死,线程它去跑后面的代码,不等待),需轮询(可以做其他事情,隔一段时间看一下,recv轮询查看有没有数据,一直询问,直到数据准备好了之后再阻塞复制)

反复询问 = 轮询;立刻离开不等待 = 非阻塞

在微观下也会等待(即搬运数据的时候也要等待),也阻塞,前期检测大部分时间检查的时候不阻塞;

IO复用:进程通过select、epoll等同时监听多个fd,当任意一个fd就绪时就调用读取函数直接复制数据(可以一次性处理本轮所有就绪的fd,其余没有数据的时间就休眠不占用CPU,可以多轮处理)(单线程同时监听多个fd,不是多线程,不用轮询)

每一个文件描述符都有一个缓冲区,多个缓冲区拿一个或几个来读数据,(多选一多选多);会阻塞;在自己的处理函数把缓冲区的数据搬到buf(内核发通知就开始搬数据);搬数据的时候不能执行代码

IO复用:一个系统调用,同时监听多个文件描述符,只要其中任意一个fd就绪,调用就返回,随后进程再单独处理就绪fd

信号驱动式IO:内核在数据准备好时发送信号通知进程,进程再主动调用函数复制

因为它也是得自己通过进程手动复制数据就不异步;不用阻塞等待,等通知再来处理复制;无阻塞

同步与阻塞没有必然关系,同步不一定是阻塞,而阻塞一定是同步;

是否同步就看复制函数与执行代码(做其他事)能不能同时进行,能同时进行就是异步,不能就是同步,而不是看阻塞

也要等,会阻塞(错);它会收到底层给它发的通知;只通知,需进程自己拷贝数据

上面四种IO都属于同步IO

异步IO:进程发起IO请求后立即返回,内核自动完成数据准备和复制全过程(由内核完成),完成后通知进程,进程无需等待或主动复制

不需要任何等待;异步IO的数据是由内核去搬运(拷贝);两段等待;搬数据与执行代码(执行命令操作)可以同时进行,不需要任何等待

非阻塞I/O:fcntl函数,file control文件控制函数:获取属性(获取文件描述符属性,开启O_NONBLOCK非阻塞),设置属性;按位或|追加O_NONBLOCK非阻塞标志,再用F_SETFL将新标志写会fd,完成非阻塞设置

fd_set是位图的首地址;按位数的首地址

位图:

8、什么是粘包?为什么会产生粘包现象?如何解决粘包

粘包是发送方发送的若干个数据到达接收方是粘成一包,从接收缓冲区来看,后一包数据的头紧接着前一包数据的尾,出现粘包的原因是多方面的;可能来自发送方,也可能来自接收方。

产生粘包的原因:

1、发送方的问题

TCP默认使用Nagle算法(主要作用:减少网络中报文段的数量),而Nagle只负责两件事:

1>先要得到上一组的确认才能发送下一个分组

2>将多次间隔较小、数据量较小的数据,合并成一个数据量大的数据块,然后进行封包、发送

2、接收方的问题

缓冲区读取、读取粒度;接收方未按发送方的数据包边界读取,导致多包合并;

缓冲区机制:发送方缓冲区可能合并多个小数据包,接收方缓冲区积累数据;如果TCP接收数据包到缓存的速度大于应用程序从缓存中读取数据包的数据,多个包就会被缓存,应用程序就有可能读取到多个首尾相接黏到一起的包

什么时候需要处理粘包现象?

当数据分成各个部分互不相干,甚至是并列关系,这时候就需要考虑粘包现象

如何解决粘包问题?

1.固定消息长度法:

约定每个业务消息占用固定字节长度,接收方每次严格读取对应长度字节,读完就是一条完整包

,多余的字节留给缓冲区下次读取

2.头部携带消息长度(工业级常用)

每条数据报头部固定4个字节存放后序消息体的字节长度,接收方先读取4字节拿到长度值,再精确读取对应长度的消息体(发送每台数据时,将数据的长度一并发送,假设包头是4字节,可以先接受包头的4个字节,再计算包体的长度,然后继续接收)

3.特殊分隔符表示:

在数据包末尾添加特殊分隔符(如\r\n),接收方按分隔符拆分

//.应用层消息边界:

在应用层协议中定义消息格式,明确包边界

4.关闭Nagle算法,使用TCP_NODELAY选项关闭算法(辅助方案);

9、举出超时检测的三种方法

1.使用setsockopt函数设置套接字属性;

struct timeval tm;

tm == (5,0);

if(setsockopt(fd,SOL_SOCKET,SO_RCVTIMEO,&tm,sizeof(tm))<0)

{

perror("timeout");

exit(-1);

}

2.使用多路复用函数(select、poll、epoll)设置超时状态;以select为例

fd_set fds;//定义位图

FD_ZERO(&fds);//将位全部置为0

FD_SET(fd,&fds);//将需要检测的文件描述符插入到位图中;(把fd对应的二进制位,在位图fds中置为1)

struct timeval tm = (5,0);//每次循环都重新设置超时时间

fi(select(fd+1,&fds,NULL,NULL;&tm)==0)

{

}

3.通过定时器设置超时检测;如alarm、setitimer()函数;使用setitimer()函数启动定时器,定时器到时后会触发SIGALRM信号。

select函数

原型

int select(int nfds,fd_set *readfds,fd_set_set *writefds,fd_set *exceptfds,struct timeval *timeout);

有三个位图;readfds;writefds;exceptfds;位图是按位进行操作的;位操作的函数有:

void FD_CLR(int fd,fd_set *set);//所有位置清空

void FD_ISSET(int fd,fd_set *set);//判断

void FD_ZERO(fd_set *set);

leve指定控制套接字的层次,可以去三个值

1>SOL_SOCKET:通用套接字选项    socket  option level套接字选项层级

2>IPPROTO_IP:IP选项

3>IPPROTO_TCP: TCP选项

optname指定控制的方式(选项的名称),

选项名称

SO_RCVTIMEO:接收超时 socket receive timeout 

SO_SNDTIMEO:发送超时

10、TCP与UDP有什么区别

区别 TCP UDP
连接 面向连接 无连接
可靠性 可靠,有三次握手与四次挥手保证数据传输的可靠性,差错检测,出错重传机制 不可靠,只负责传数据,不保证数据的完整性和损坏情况;不保证送达、顺序;丢包不重传
消息边界 无消息边界,容易产生粘包现象 有边界,一个包与一个包之间是分割开的
传输格式 数据报文;×是数据流传输 数据包×;是数据报传输
开销    开销指的是头部开销;大;(20-60字节):包括变长;包含序号、确认号等 小;固定8字节,仅含端口、长度、校验和
传输速度 慢;因为有握手与挥手等控制操作 快,无繁琐机制检验信息的可靠性(实时性强、开销小、无等待)
使用场景

消息对话、文件内存小的传输×

HTTP/HTTPS;FTP/SMTP;远程连接;文件传输

视频电话、视频直播、语音、DNS、游戏实时监控

数据包有结构吗?

数据包有严格分层结构,分层封装,每层都有固定头部格式
数据传输遵循五层网络模型,从上到下逐层打包,每层都有自己的头部结构,像套多层信封。
以你访问百度的 HTTP 请求举例,完整封装顺序(从上到下):
应用层 → 传输层 → 网络层 (IP) → 数据链路层 (以太网帧)
一、每一层独立结构拆解(由内到外,内层是载荷,外层是头部)
1. 应用层(最内层,原始数据)
内容:HTTP 网页数据、DNS 查询文字(纯业务数据,无标准包头)
示例:GET / HTTP/1.1 Host:www.baidu.com
2. 传输层(TCP/UDP 头部)
在应用数据外面套 TCP/UDP 头部,固定结构:
源端口、目标端口
校验和、序号、控制标记(SYN/ACK 等)
作用:区分同一台电脑多个软件的流量(浏览器、微信)
3. 网络层(IP 数据包,三层包,你重点关注)
包裹着 TCP 段,IP 包有固定头部结构:
版本(IPv4/IPv6)
头部长度、TTL(路由跳数)
协议(标记里面是 TCP 还是 UDP)
首部校验和
源 IP 地址、目的 IP 地址(核心字段)
这一层就是我们常说的「IP 数据包」,跨互联网全程携带。
4. 数据链路层(以太网二层帧,最外层包装)
把整个 IP 包当成载荷,外面套以太网帧头 + 尾部校验,完整帧结构:
帧头(二层核心):
前导码(同步信号)
目的 MAC 地址(下一跳设备硬件地址)
源 MAC 地址(本机网卡 MAC)
类型字段(0x0800 = 里面封装 IPv4 包)
载荷:完整 IP 数据包
帧尾:FCS 校验码(检查传输是否损坏)

数据包的分层结构属于实际互联网TCP/IP的四层模型;

TCP/IP四层模型:

1.是一套完整的通信规则,包发送打包、传输转发、接收拆包全部流程;

2.拆包只是接收端的其中一个操作,是遵循四层规则的步骤之一,不是模型的全部功能】

例如:

TCP/IP四层 = 完整快递运输体系(寄件打包、干线运算、驿站中转、收件拆件)

结构数据包 =收件人拆包,是整个体系中的最后一步动作

源 IP 什么时候从电脑内网 IP 换成路由器公网 IP?
切换发生在路由器 LAN 口接收数据包、剥离二层帧头部之后,转发到 WAN 口之前,也就是 NAT 地址转换步骤
完整时间线拆分(电脑访问百度全过程):
电脑发包(内网传输阶段)
三层 IP 包头:
源 IP = 电脑内网 IP 192.168.1.100,目的 IP = 百度公网 IP
二层帧头:源 MAC = 电脑网卡 MAC,目的 MAC = 路由器 LAN MAC
此时源 IP 还是本机内网地址,没有任何变化。
路由器 LAN 口接收、解封装
路由器收到以太网帧,拆掉二层帧头,提取里面完整的 IP 数据包,读取三层头部:源 IP 是内网私有 IP。
路由器判断目标是外网 IP,触发SNAT 源网络地址转换。
NAT 转换(源 IP 修改的关键一步)
在 NAT 映射表记录对应关系:192.168.1.100:随机端口 ↔ 路由器公网IP 223.112.x.x:新映射端口
直接修改 IP 头部里的源 IP:把内网192.168.1.100替换成路由器 WAN 公网 IP 223.112.x.x
目的 IP 全程不变,依旧是百度服务器 IP。
路由器 WAN 口重新封装二层帧发往运营商
修改完成的 IP 包被装进新的以太网帧,从 WAN 口送出。
从此刻开始,整个公网传输链路(运营商各级路由→百度服务器),数据包三层源 IP 永久是路由器公网 IP,不会再变回内网 IP。

 应用层为什么叫「用户直接使用」?分层对比理解

下层(传输 / 网络 / 链路 / 物理)都是操作系统、网卡、路由器自动处理,用户完全看不见、不用管:
传输层 TCP/UDP:内核自动分片、重传、端口区分,用户代码不用管;
网络层 IP:路由器自动寻址路由,你不用手动填 IP 包;
数据链路层以太网:网卡自动加 MAC、FCS 校验,无感;
物理层:网线光信号,硬件自动传输。
只有应用层提供标准化、可直接调用的业务功能,用户 / 软件直接拿来用:

人不用懂网络底层;
开发软件不用自己实现一套文件下载、网页访问规则。

常见「用户直接使用」的应用层服务 & 协议
1. 网页浏览(HTTP/HTTPS)
用户打开浏览器输入网址,直接使用网页服务。
底层 TCP、IP、以太网全部系统自动处理,你只操作网页内容。
2. 文件传输(FTP/TFTP)
用户上传、下载服务器文件,软件直接调用 FTP 服务,不用自己写数据包收发逻辑。
3. 域名解析(DNS)

输入www.baidu.com,系统自动调用 DNS 服务翻译成 IP,用户无感知但直接依赖这个服务上网

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐