输入网址到网页显示全过程

TCP/IP ⽹络模型

对于同⼀台设备上的进程间通信,有很多种⽅式,⽐如有管道、消息队列、共享内存、信号等⽅式,⽽对于不同设备上的进程间通信,就需要⽹络通信,⽽设备是多样性的,所以要兼容多种多样的设备,就协商出了⼀套通⽤的⽹络协议。

应⽤层

在OSI模型或TCP/IP模型中,应用层位于层次结构的最上层,直接服务于最终用户的应用程序。这一层的重点是如何提供网络服务或数据给用户应用,而不涉及数据传输的底层细节。

应用层协议定义了运行在不同终端设备上的应用程序如何进行通信。这些协议包括但不限于HTTP(超文本传输协议),用于网页浏览;FTP(文件传输协议),用于文件下载和上传;SMTP(简单邮件传输协议),用于电子邮件发送;DNS(域名系统),用于解析域名到IP地址;Telnet,用于远程登录。

当应用层的一个程序需要与另一个程序通信时,它会将应用数据发送给传输层。传输层的主要职责是提供端到端的数据传输服务,确保数据能够从源头安全、准确地传送到目的地。传输层使用的协议包括TCP(传输控制协议)和UDP(用户数据报协议)。

值得注意的是,应用层工作在操作系统的用户态,而传输层及其以下的层次(如网络层、数据链路层、物理层)则工作在内核态。用户态和内核态是操作系统的两种不同的权限模式。用户态允许用户应用程序运行,而内核态则有更高的权限,能够直接访问硬件和执行关键的系统任务。

这种分层的设计使得应用程序开发者可以专注于应用逻辑和用户体验,而无需关心数据如何在网络中传输的复杂细节。这也使网络通信更加模块化,有助于不同层次的技术和协议的独立发展和改进。

传输层

应⽤层的数据包会传给传输层,传输层(Transport Layer)是为应⽤层提供⽹络⽀持的。

image-20240319092525062

在传输层会有两个传输协议,分别是 TCP 和 UDP。

TCP (Transmission Control Protocol)

TCP 是一种面向连接的、可靠的传输层通信协议,设计目的是确保数据包能够可靠地、按顺序地从源传输到目的地。TCP 实现了几个关键特性以保证这种可靠性:

  • 流量控制:通过控制数据传输的速率,防止网络中的任一部分被过量的数据流淹没。
  • 超时重传:如果一个数据包在设定的时间内未被确认收到,则会重新发送该数据包。
  • 拥塞控制:在网络拥堵时减少数据的发送速率。
  • 有序数据传输:确保数据包按照发送顺序到达接收方。
  • 错误检测:通过校验和等方法检测数据在传输过程中的任何错误。

TCP 适用于那些需要高可靠性的应用,如网页浏览、文件传输、电子邮件等。

UDP (User Datagram Protocol)

UDP 是一种无连接的协议,相对于 TCP 来说,它简单得多,提供的是一种不可靠的服务。UDP 只是将应用层数据打包并发送,不保证数据包的可靠到达,也不进行错误检测、流量控制或拥塞控制。UDP 的这种设计使其在实时性要求较高的场景中(如视频会议、实时游戏)更为适用,因为即使丢失一些数据包,也不会像 TCP 那样等待重传,从而避免了延迟。

虽然 UDP 本身不提供可靠性保证,应用层可以在需要的情况下实现类似于 TCP 的可靠传输机制,如通过数据包重传、数据完整性校验等方式来确保数据的可靠到达。但是,实现一个商业级的可靠 UDP 传输协议是复杂的,需要在保持 UDP 高效率和低延迟的特点的同时,增加额外的可靠性机制。

数据分块和TCP段

对于大数据传输,TCP 采用分段的方法来优化传输过程。这意味着大块数据会被切分成更小的段,每个段都有自己的序号和校验和。这样,如果某个段在传输过程中丢失或损坏,只需重新传输那个特定的段,而不是整个数据包。MSS(最大报文段长度)是一个重要的参数,它定义了TCP段的最大数据量,帮助优化网络传输,避免因数据包过大而导致的网络拥堵。

总的来说,TCP和UDP各自服务于不同类型的网络应用需求,前者侧重于可靠性和顺序性,后者则侧重于低延迟和高效率。

image-20240319093310634

端口号的作用

  • 区分服务:在一个网络通信过程中,IP地址用来识别目标设备,而端口号则用来指定该设备上的特定应用。这样,即使多个应用同时使用同一网络协议(例如TCP或UDP)进行通信,它们也可以通过各自的端口号被正确区分和识别。
  • 实现多任务:同一台计算机上可以同时运行多个网络服务(如Web服务、邮件服务等),通过使用不同的端口号,这些服务可以同时监听网络请求,无需相互干扰。

常见端口号

  • 80端口:通常被HTTP服务使用,用于Web服务器。
  • 22端口:常用于SSH服务,用于安全的远程登录和其他安全网络服务。
  • 443端口:用于HTTPS服务,即加密的HTTP通信,提供安全的Web浏览。
  • 21端口:FTP服务使用,用于文件传输。

对于客户端应用程序(如Web浏览器中的标签),操作系统会分配临时端口号(也称为动态端口号)。这些端口号通常从一个特定的范围内选择,不用于标准网络服务。动态端口的使用允许多个网络应用并发运行,而不冲突。

当数据包在网络中传输时,它们的头部信息包括源端口号和目标端口号。这样,当数据包到达目标设备时,传输层可以通过目标端口号确定哪个具体的应用程序应该接收这些数据。同样地,源端口号告诉接收方如何回应消息,确保响应能返回给正确的应用程序。

端口号的这种设计极大地增强了网络通信的灵活性和效率,使得复杂的网络应用和服务得以在同一台设备上协同工作。

传输层的职责

传输层主要负责应用程序之间的数据传输服务,确保数据可以在应用程序之间准确无误地传递。它不直接处理数据的路由选择或跨网络的传输。传输层的职责包括:

  • 确保数据完整性:通过校验和等方法检测传输过程中的错误。
  • 保持数据顺序:确保数据包的顺序与发送时一致。
  • 流量控制和拥塞避免:防止网络过载。
  • 多路复用和分解:允许多个应用程序通过不同的端口同时使用网络。

⽹络层

网络层的职责

网络层负责数据包在网络中的传输和路由选择。这一层涉及到数据包在整个网络中从源头到目的地的传递,包括跨越不同的网络和中间设备(如路由器)。网络层的核心协议是IP(Internet Protocol),它定义了数据包的路由方式和地址格式。网络层的主要职责是:

  • 路由:决定数据包从源到目的地的路径。
  • 分片和重组:根据网络的MTU(最大传输单元),可能需要将大的数据包分成较小的片段进行传输,目的地再将这些片段重组。
  • 寻址:使用IP地址标识发送者和接收者。

传输层可能⼤家刚接触的时候,会认为它负责将数据从⼀个设备传输到另⼀个设备,事实上它并不负责。
实际场景中的⽹络环节是错综复杂的,中间有各种各样的线路和分叉路⼝,如果⼀个设备的数据要传输给另⼀个设备,就需要在各种各样的路径和节点进⾏选择,⽽传输层的设计理念是简单、⾼效、专注,如果传输层还负责这⼀块功能就有点违背设计原则了。也就是说,我们不希望传输层协议处理太多的事情,只需要服务好应⽤即可,让其作为应⽤间数据传输的媒介,帮助实现应⽤到应⽤的通信,⽽实际的传输功能就交给下⼀层,也就是⽹络层(Internet Layer)。

image-20240319101537211

⽹络层最常使⽤的是 IP 协议(Internet Protocol),IP 协议会将传输层的报⽂作为数据部分,再加上 IP 包头组装成 IP 报⽂,如果 IP 报⽂⼤⼩超过 MTU(以太⽹中⼀般为 1500 字节)就会再次进⾏分⽚,得到⼀个即将发送到⽹络的 IP 报⽂。

数据包的封装过程

  • 当数据从应用层下发到传输层,如使用TCP或UDP协议,它会被封装成一个段(TCP)或数据报(UDP),并附加上相应的端口号。
  • 传输层的数据随后下发到网络层,网络层将传输层的数据段或数据报封装在IP包中,加上IP头部信息,这些头部信息包括源IP地址和目标IP地址等。
  • 如果IP包的大小超过网络的MTU,网络层会将包分片。每个片段都能独立路由到目的地,在那里它们会被重新组装成原始的IP包。
image-20240319101929820

⽹络层负责将数据从⼀个设备传输到另⼀个设备,世界上那么多设备,⼜该如何找到对⽅呢?因此,⽹络层需要有区分设备的编号。

我们⼀般⽤ IP 地址给设备进⾏编号,对于 IPv4 协议, IP 地址共 32 位,分成了四段(⽐如,192.168.100.1),每段是 8 位。只有⼀个单纯的 IP 地址虽然做到了区分设备,但是寻址起来就特别麻烦,全世界那么多台设备,难道⼀个⼀个去匹配?这显然不科学。
因此,需要将 IP 地址分成两种意义:
⼀个是⽹络号,负责标识该 IP 地址是属于哪个「⼦⽹」的;
⼀个是主机号,负责标识同⼀「⼦⽹」下的不同主机;
怎么分的呢?这需要配合⼦⽹掩码才能算出 IP 地址 的⽹络号和主机号。

IP地址

IP地址是分配给每个连接到网络的设备的唯一标识符。对于IPv4,它是一个32位的数字,通常表示为四个十进制数(每个范围从0到255),用点分隔,例如192.168.100.1。这种结构允许大约42亿(2^32)的唯一地址。

子网掩码

子网掩码用于确定IP地址中哪一部分表示网络地址,哪一部分表示主机地址。通过将IP地址与子网掩码进行按位与(AND)运算,可以得到网络地址。子网掩码通常也是一个32位的数字,表示为与IP地址相同的点分十进制格式,例如255.255.255.0,或者作为CIDR表示法中的斜杠后数字,例如/24。

网络地址和主机地址的计算

  • 网络地址的计算:将IP地址与子网掩码按位与运算得到。这表示了IP地址所在的子网。
  • 主机地址的计算:将IP地址与子网掩码的反码按位与运算得到。这表示了子网中特定设备的标识。

例子

以IP地址10.100.122.2和子网掩码255.255.255.0(/24)为例:

  • 子网掩码/24表示前24位是网络部分,后8位是主机部分。
  • 网络地址计算:10.100.122.2 AND 255.255.255.0 = 10.100.122.0
  • 主机地址计算:10.100.122.2 AND 0.0.0.255(255.255.255.0的反码)= 0.0.0.2

网络地址10.100.122.0表示所有以此地址开始的设备都位于同一子网内。主机号2指的是该子网内的特定设备。

image-20240319102642394

子网掩码的作用

通过改变子网掩码,可以控制子网的大小。更多的位分配给网络部分意味着更多的子网,但每个子网中可以有的主机数就更少;相反,更多的位分配给主机部分意味着更少的子网,但每个子网可以包含更多的主机。子网掩码的设计使得网络管理员可以根据需要灵活地划分网络,以适应不同的网络规模和需求。

IP寻址

IP寻址的基本过程包括确定目标设备的IP地址,然后利用子网掩码来区分网络地址和主机地址。在数据包的传输过程中,网络地址用于确定目标设备位于哪个子网,而主机地址则用于识别该子网内的具体设备。只有当数据包到达了正确的子网,它才能被送达给正确的主机。

路由

路由是决定数据包从源头到目的地之间传输路径的过程。路由器在这个过程中起着至关重要的作用:

  1. 路径决定:路由器利用路由表来决定数据包的最佳路径。路由表包含了不同目的地的IP地址范围和对应的下一跳地址。下一跳可以是另一个路由器,这样数据包就通过一系列跳跃,最终到达目的地。
  2. 子网间转发:当数据包到达一个网络节点(如路由器)时,路由器检查目标IP地址,确定下一步应该转发到哪个子网或直接到达的主机。
  3. 动态路由协议:在复杂的网络环境中,路由器通过动态路由协议(如OSPF、BGP)自动更新路由表信息,以应对网络变化,确保数据包沿着最佳路径传输。

数据包转发

当路由器接收到一个数据包时,它首先检查数据包的目标IP地址,然后与路由表中的记录进行匹配,找出最合适的下一跳。如果目标地址在直接连接的网络中,数据包将直接发送到目标主机。如果不在,数据包将被转发到下一跳路由器。这一过程会一直重复,直到数据包到达最终目的地。

通过这种方式,即使在一个由数以千计的网络和设备构成的复杂互联网环境中,数据包也能够通过寻址和路由的机制找到一条路径,从而成功地从发送者传输到接收者。

所以,IP 协议的寻址作⽤是告诉我们去往下⼀个⽬的地该朝哪个⽅向⾛,路由则是根据「下⼀个⽬的地」选择路径。寻址更像在导航,路由更像在操作⽅向盘。

image-20240319103412824

⽹络接⼝层(数据链路层)

网络接口层,也称为链路层或数据链路层,是负责网络物理实体间数据传输的网络模型的一部分。它直接与网络的物理连接(如以太网、WiFi)打交道,确保数据能够在物理网络上有效地传输。

MAC地址

  • 定义:MAC(媒体访问控制)地址是链路层地址,用于标识网络上的设备。每个网络接口卡(Network Interface Card, NIC)都有一个全球唯一的MAC地址,确保在局域网中每个设备都可以被唯一识别。
  • 作用:在数据链路层,数据包是通过MAC地址来寻址的,而不是IP地址。这意味着,为了在局域网内部发送数据包,发送方需要知道接收方的MAC地址。

ARP协议

ARP(地址解析协议)是一种网络协议,用于将网络层的地址(如IP地址)解析为链路层的地址(如MAC地址)。当一个设备想要与同一局域网内的另一个设备通信时,但只知道其IP地址,它可以使用ARP协议来查询对应的MAC地址。

数据包的封装过程

  1. 网络层:数据包在网络层被赋予一个IP头部,标识了数据包的源IP地址和目标IP地址。

  2. 链路层:数据包下发到链路层时,链路层会在IP头部的前面加上MAC头部,其中包含了源MAC地址和目标MAC地址。这个过程中,如果不知道目标MAC地址,会先使用ARP协议进行查询。

  3. 发送数据帧:经过MAC头部封装的数据包变成了一个完整的数据帧,然后通过物理介质(如以太网线、WiFi信号)发送出去。

综上所述,TCP/IP ⽹络通常是由上到下分成 4 层,分别是应⽤层,传输层,⽹络层和⽹络接⼝层。

image-20240319104349600

每⼀层的封装格式:

image-20240319104443924

⽹络接⼝层的传输单位是帧(frame),IP 层的传输单位是包(packet),TCP 层的传输单位是段(segment),HTTP 的传输单位则是消息或报⽂(message)。但这些名词并没有什么本质的区分,可以统称为数据包。

键⼊⽹址到⽹⻚显示,期间发⽣了什么?

image-20240320064428308

孤单⼩弟 —— HTTP

  • 浏览器做的第⼀步⼯作是解析 URL

⾸先浏览器做的第⼀步⼯作就是要对 URL 进⾏解析,从⽽⽣成发送给 Web 服务器的请求信息。
对于一条长长的URL,其包含的元素和每个元素的作用是很具体的。一般而言,一个完整的URL(Uniform Resource Locator统一资源定位符)由以下部分组成:

  1. 协议:这部分位于URL的最开始,以“😕/”作为分隔符。常见的协议有HTTP(超文本传输协议)和HTTPS(安全超文本传输协议),还有FTP(文件传输协议)等。协议指定了浏览器与服务器之间通信的方式和规则。
  2. 域名:紧随协议之后,通常是一个域名(如example.com),它是互联网上某个服务器或一组服务器的地址。域名提供了一种记忆和访问网络资源的简便方式,背后通过DNS(域名系统)解析为IP地址。
  3. 端口:可选项,位于域名之后,由冒号“:”与域名分隔。端口号指定服务器上的特定服务。如果未指定,浏览器会使用协议的默认端口(例如,HTTP的默认端口是80,HTTPS的是443)。
  4. 路径:在域名或端口之后,以“/”开头。路径指向服务器上的一个特定资源或页面。例如,在URL http://example.com/photos/myphoto.jpg中,“/photos/myphoto.jpg”是路径,指向服务器上名为myphoto.jpg的图片文件。
  5. 查询字符串:可选项,以“?”开始,之后是一系列的参数。这些参数通常用于向服务器传递信息或指令。例如,在http://example.com/search?q=example中,“q=example”是查询字符串,表示搜索关键词为“example”。
  6. 锚点:可选项,以“#”开始。锚点用于指定网页中的一个位置,使浏览器能够直接跳转到该位置。例如,在URL http://example.com/index.html#content中,“#content”是锚点,指向网页中id为content的元素。
image-20240320064629212

所以图中的⻓⻓的 URL 实际上是请求服务器⾥的⽂件资源。
要是上图中的蓝⾊部分 URL 元素都省略了,那应该是请求哪个⽂件呢?当没有路径名时,就代表访问根⽬录下事先设置的默认⽂件,也就是 /index.html 或者/default.html 这些⽂件,这样就不会发⽣混乱了。

  • ⽣产 HTTP 请求信息

对 URL 进⾏解析之后,浏览器确定了 Web 服务器和⽂件名,接下来就是根据这些信息来⽣成 HTTP 请求消息了。

这个过程涉及以下几个关键步骤:

  1. 建立连接:浏览器使用解析出的IP地址和端口号(如果URL中没有指定端口号,则使用协议的默认端口,例如HTTP的默认端口是80,HTTPS的是443)与目标Web服务器建立TCP连接。如果是HTTPS协议,这一步还将包括TLS握手过程以建立安全连接。
  2. 构造请求行:HTTP请求消息的第一部分是请求行,它由请求方法(如GET、POST)、请求的资源路径(URL中的路径部分,可能包括查询字符串)和HTTP协议版本组成。例如,“GET /index.html HTTP/1.1”。
  3. 添加请求头:在请求行之后,浏览器会添加一系列的请求头,这些请求头提供了浏览器、用户代理和请求本身的额外信息。常见的请求头包括Host(指定请求的服务器地址)、User-Agent(浏览器标识)、Accept(浏览器能够接收的响应内容类型)、Accept-Language(用户语言偏好)等。
  4. 添加请求体:对于某些类型的请求,特别是POST请求,请求消息还包括一个请求体部分。请求体通常包含要发送给服务器的数据,如表单数据或文件上传。
  5. 发送请求:构造完成后,浏览器通过之前建立的TCP连接将HTTP请求消息发送给目标Web服务器。
  6. 等待响应:发送请求后,浏览器等待服务器的响应。服务器处理收到的请求,并返回一个HTTP响应消息,包括状态码(如200表示成功,404表示未找到),响应头(提供响应的额外信息,如内容类型、编码方式)和响应体(请求的实际资源内容)。

整个过程是浏览器与Web服务器通信的基础,确保了用户可以通过输入URL访问到互联网上的资源。

image-20240320065214199

⼀个孤单 HTTP 数据包表示:“我这么⼀个⼩⼩的数据包,没亲没友,直接发到浩瀚的⽹络,谁会知道我呢?谁能载我⼀程呢?谁能保护我呢?我的⽬的地在哪呢?”。充满各种疑问的它,没有停滞不前,依然踏上了征途!

真实地址查询 —— DNS

DNS(域名系统Domain Name System)的主要职责是将人类可读的域名(如 www.example.com)转换为机器可读的IP地址(如 192.0.2.1),这个过程被称为域名解析。由于互联网上的资源是通过IP地址来定位的,DNS解析对于用户能够顺利访问这些资源至关重要。

  • 域名层级结构

域名系统采用层级式的结构,这种结构有助于组织和管理域名。从右向左阅读域名时,每个点.分隔的部分代表一个不同的层级。以下是从最高层到最低层的域名组成:

  • 根域(.:域名系统的最顶层,通常在实际使用中不直接见到,但它在DNS解析过程中起着根本的作用。
  • 顶级域(TLD):位于根域名之下,如.com.org.net等。这些是域名层级中的第一级,用于表示网站的性质或地理位置,比如.gov表示政府机构,.cn表示中国。
  • 二级(权威)域名:通常是指购买的具体域名,如在www.example.com中的example。它位于顶级域名之下,用于表示特定的组织或公司。
  • 子域名:进一步细分的域名,如www。在www.example.com中,wwwexample.com的子域名,常用于指向网站的WWW服务。

image-20240320070846675

DNS解析的工作流程是互联网上域名到IP地址映射的核心过程,确保了人们能够通过易于记忆的域名访问网站,而不是直接使用复杂的IP地址。下面是该过程的详细分析:

  1. 客户端发起DNS查询:当你尝试访问www.server.com时,你的设备(客户端)首先检查自己的DNS缓存是否有这个域名的记录。如果没有,它会向配置的本地DNS服务器发送一个查询请求,这通常是你的互联网服务提供商(ISP)的DNS服务器。
  2. 本地DNS服务器的角色:本地DNS服务器接收到查询请求后,它也会检查自己的缓存。如果找到了对应的IP地址,就直接返回给客户端。如果没有,它需要进行一系列查询以解析域名。
  3. 查询根DNS服务器:如果本地DNS服务器的缓存中没有相关记录,它会向根DNS服务器查询。根DNS服务器是域名层级结构的最顶层,它不直接知道域名的IP地址,但知道如何到达顶级域(如.com)的DNS服务器。
  4. 查询顶级域(TLD)DNS服务器:根DNS服务器会将查询请求引导至负责该顶级域名(例如.com)的DNS服务器。这个TLD DNS服务器管理所有.com结尾的域名记录,但它仍然不会直接解析www.server.com
  5. 查询权威DNS服务器:TLD DNS服务器会告诉本地DNS服务器负责server.com域名的权威DNS服务器的地址。权威DNS服务器是由域名的注册者指定的,负责存储该域名的所有子域名的DNS记录。
  6. 获取最终的IP地址:本地DNS服务器最后向权威DNS服务器发送查询请求。权威DNS服务器包含了www.server.com的具体IP地址信息,它会将这个IP地址响应给本地DNS服务器。
  7. 返回给客户端:本地DNS服务器收到IP地址后,将其返回给最初发起请求的客户端。此时,客户端就知道了www.server.com的IP地址,并可以开始与服务器建立连接。
  8. 缓存结果:为了提高后续查询的效率,DNS查询结果会在客户端和各级DNS服务器上被暂时缓存。这意味着如果很快有另一个查询到相同的域名,可以直接使用缓存中的IP地址,而不需要再次经历整个查询过程。

image-20240320073725204

DNS 域名解析的过程蛮有意思的,整个过程就和我们⽇常⽣活中找⼈问路的过程类似,只指路不带路。

域名解析过程看起来复杂且可能消耗较多时间,但实际上,缓存机制大大优化了这一过程,提高了解析的效率。缓存存在于多个层级,包括浏览器缓存、操作系统缓存、以及DNS服务器缓存。下面是域名解析时考虑缓存的一般流程:

  1. 浏览器缓存:当你试图访问一个网站时,浏览器首先检查自己的DNS缓存中是否有这个网站域名的记录。浏览器缓存的生存时间(TTL,Time To Live)虽然较短,但这是最快的缓存查找步骤。如果在浏览器缓存中找到了对应的IP地址,就可以直接使用,不需要进一步的DNS解析。
  2. 操作系统缓存:如果浏览器缓存中没有找到域名对应的IP地址,查询请求就会转发给操作系统。操作系统同样会维护一个DNS缓存列表。这个缓存来自之前所有应用的DNS查询结果,有效期通常比浏览器缓存长。
  3. hosts文件:如果在操作系统的DNS缓存中也没有找到,系统会检查hosts文件。这是一个本地文件,允许用户手动指定域名到IP地址的映射。如果在hosts文件中找到了对应条目,就直接使用这个IP地址,不进行外部DNS查询。
  4. 本地DNS服务器查询:如果前面的步骤都未能解析域名,请求最终会被发送到配置的本地DNS服务器。本地DNS服务器自身也会维护一个缓存,如果近期有其他请求查询过同一个域名,那么该服务器可能已经有了这个域名的缓存记录,可以直接返回IP地址而无需进一步的递归查询。

这些缓存机制确保了只有在缓存未命中的情况下,域名解析请求才会进行更多的网络查询。这不仅减少了对DNS根服务器、顶级域名服务器和权威名称服务器的负担,也显著加快了用户访问网站的速度。缓存是提高DNS解析效率的关键机制之一。

指南好帮⼿ —— 协议栈

在数据包知道了目的地IP地址之后,它需要通过操作系统中的协议栈来实现数据的发送。协议栈,也被称为网络栈或TCP/IP栈,是一系列网络协议的集合,它定义了通过网络进行通信时数据如何被封装、地址化、传输、路由和接收。下面是协议栈工作流程的简要分析:

  1. 应用层:这是协议栈的最顶层,包含了运行在用户空间的各种应用程序,如Web浏览器、电子邮件客户端等。应用程序通过调用Socket库与协议栈进行交互。当浏览器想要发送HTTP请求时,它会通过Socket库生成一个请求数据包。
  2. 传输层(TCP/UDP):在应用层和网络层之间,负责提供端到端的数据传输服务。TCP(传输控制协议)提供的是可靠的、面向连接的服务,确保数据准确无误地传输;而UDP(用户数据报协议)则提供更简单、不保证可靠性的传输服务。应用层根据需要选择TCP或UDP来传输数据。
  3. 网络层(IP协议):负责对数据包进行路由和寻址,确保数据包能够跨越多个网络从源头到达目的地。IP协议会将数据分割成多个小包,每个包都包含源IP地址和目的IP地址信息。在这一层,还有ICMP(因特网控制消息协议)和ARP(地址解析协议)。
    • ICMP用于传递控制消息,例如当数据无法到达目的地时返回错误信息。
    • ARP用于将网络层的IP地址解析成下一层的物理地址(MAC地址)。
  4. 数据链路层:处理与物理网络的直接交互,将网络层传下来的IP数据包封装成帧,然后交给物理层传输。在这一层,数据包会被赋予物理地址,确保能够在同一局域网内正确传送。
  5. 物理层:涉及实际的物理设备和传输介质,如网卡、光纤、电缆等。它负责在物理媒介上实际传输数据链路层封装好的帧。

在整个过程中,每一层都执行其专门的功能,将数据从源头送到目的地。当数据包被发送出去时,它从应用层向下逐层经过封装,每层都添加了相应的头部信息。到达目的地后,数据包会逐层向上被解封装,最终到达目的地的应用层。这个分层的设计使得网络通信变得更加灵活和可靠,同时也便于不同网络技术和协议的集成和协作。

image-20240320081755361

可靠传输 —— TCP

TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,它确保了在两个应用程序之间发送的数据包是完整无误且按顺序到达的。要实现这些功能,TCP头部包含了多种字段,每个字段都有特定的用途。下面是TCP头部的一些关键部分及其作用的详细分析:

image-20240320082422112
  1. 源端口号和目标端口号:这两个字段分别标识了发送方和接收方的端口号,用于确定数据包的起点和终点。端口号允许TCP/IP协议栈将数据包分发给正确的应用程序。
  2. 序列号:序列号用于确保数据包的有序传输。每个TCP段(数据包的另一称呼)都被赋予一个序列号,接收方可以通过这些序列号来重新组装接收到的数据段,确保数据的正确顺序。
  3. 确认号:确认号用于实现可靠传输。当一个TCP段到达目的地时,接收方会发送一个带有下一个期望接收的序列号的确认(ACK)回去。这样,发送方就知道哪些数据已经成功被接收,哪些需要重传。
  4. 状态位
    • SYN(同步)标志用于建立连接过程中的同步序列号。
    • ACK(确认)标志表示确认号字段有效,通常与发送数据一起使用。
    • RST(重置)标志用于重置错误的连接。
    • FIN(结束)标志表示发送方已经结束发送数据。
  5. 窗口大小:窗口大小是流量控制的一部分,它告诉对方自己还能接收多少字节的数据,从而避免发送方数据发送太快,导致接收方处理不过来。
  6. 拥塞控制:虽然TCP头部没有专门的拥塞控制字段,但TCP实现了几种拥塞控制机制,如慢启动、拥塞避免、快重传和快恢复。这些机制通过动态调整发送方的窗口大小来避免网络拥塞。

TCP通过这些机制确保了数据的可靠传输,即使在网络条件不理想的情况下也能正确地传送数据。通过序列号和确认号,TCP能够处理数据包的乱序、丢包和重复数据包问题。而通过窗口大小和拥塞控制机制,它还能有效管理数据流,防止网络过载。这些特性使得TCP非常适合需要高可靠性传输的应用,如Web浏览、文件传输和电子邮件等。

  • TCP三次握手

是建立一个TCP连接的过程,确保了双方都能够发送和接收数据。这个过程通过三个步骤确保连接的可靠性:

image-20240320083819570
  1. SYN:首先,客户端向服务器发送一个SYN(同步)报文,并进入SYN-SENT状态。这个报文包含一个客户端的初始序列号(ISN),用于同步序号。此时,客户端请求开启一个连接。
  2. SYN-ACK:服务器接收到客户端的SYN报文后,回应一个SYN-ACK报文。这个报文同时确认(ACK)客户端的SYN报文(通过增加1的方式确认客户端的初始序列号),并且也包含服务器的初始序列号,服务器此时进入SYN-RECEIVED状态。这一步确认了服务器到客户端的单向连接的有效性。
  3. ACK:最后,客户端收到服务器的SYN-ACK报文后,发送一个ACK报文作为回应,同时也进入ESTABLISHED状态。这个ACK报文确认了服务器的SYN报文。当服务器收到这个ACK报文后,也进入ESTABLISHED状态,确认了从客户端到服务器的单向连接的有效性。

此时,双方都收到了对方的确认信息,确认了双向连接的有效性,因此两端都处于ESTABLISHED状态,完成了连接的建立。这个过程的目的是确保双方各自都有发送和接收数据的能力,也就是说,保证了双方都准备好了数据的发送和接收。

  • 如何查看 TCP 的连接状态?

查看TCP连接状态的命令netstat -napt在Linux环境下非常有用,提供了当前系统中所有TCP连接的状态信息。这包括每个连接的本地和远程地址、端口号、连接状态以及相关的进程信息(如果有权限的话)。

image-20240320085007358

image-20240320085026088

  • TCP 分割数据

对于TCP分割数据的情况,这是基于TCP/IP网络传输中两个关键概念:MTU(Maximum Transmission Unit,最大传输单元)和MSS(Maximum Segment Size,最大段大小)。

image-20240320085518471
  • MTU:这是指在网络层(如IP层)能够处理的最大数据包的大小。对于大多数以太网环境,MTU通常设置为1500字节。这意味着包括头部和数据在内的整个IP包的最大长度为1500字节。
  • MSS:这是TCP层能够处理的、为保证不发生IP层分片而设置的最大数据段的大小。MSS的值通常是MTU值减去IP头(通常20字节)和TCP头(通常20字节),因此对于以太网来说,MSS通常是1460字节。

当HTTP请求或响应的数据大小超过MSS时,TCP协议会将数据分割成多个段,每个段的大小不超过MSS,然后每个段作为单独的TCP包发送。这样做的目的是为了适应不同网络环境中的数据传输要求,避免因为包过大而导致在网络中被分片,分片可能会增加网络延迟,降低传输效率,增加丢包的风险。

这种分割数据的机制确保了数据传输的高效和可靠,同时也考虑到了不同网络环境中的传输特性。通过在传输层就处理好数据分割,TCP协议可以优化数据传输过程,减少网络层面的复杂性和不确定性。

image-20240320085551121

TCP报文生成

在TCP协议中,端口号是用于区分一个主机上的不同应用程序或服务的。正如你所说,浏览器作为客户端,通常使用一个随机端口与服务器建立连接,而Web服务器监听的端口则根据服务的类型而固定,例如HTTP服务默认监听80端口,而HTTPS服务默认监听443端口。

TCP报文生成和封装过程

当客户端(例如浏览器)与服务器之间建立了TCP连接后,HTTP请求和响应的数据将被发送。这些HTTP数据被封装在TCP报文的数据部分。具体来说,一个TCP报文主要由以下几个部分组成:

  1. TCP头部:包含源端口号、目标端口号、序列号、确认号、数据偏移(头部长度)、控制标志(如SYN、ACK、FIN等)、窗口大小、校验和以及紧急指针等重要信息。这些信息确保了数据的可靠传输。
  2. 数据部分:这是TCP报文中的主体部分,用于承载上层协议(如HTTP)的数据。对于HTTP请求或响应来说,这部分数据将包括HTTP头部信息和可能的消息正文(例如,一个POST请求中的表单数据或者服务器的响应内容)。
  3. image-20240320090420251

此时,遇上了 TCP 的 数据包激动表示:“太好了,碰到了可靠传输的 TCP 传输,它给我加上 TCP 头部,我不再孤单了,安全感⼗⾜啊!有⼤佬可以保护我的可靠送达!但我应该往哪⾛呢?”

远程定位 —— IP

在网络通信中,IP报文(或称为IP包)是在互联网协议(IP)下封装和传输数据的基本单位。IP协议是TCP/IP模型中负责在网络层进行数据传输的核心协议,其报文头部包含了一系列重要的信息,确保数据能够正确地从源头传输到目的地。

  • IP包头格式

IP报文头部主要包括以下几个关键字段:

  • 版本:指明了IP协议的版本,IPv4或IPv6。
  • 头部长度:表示IP头部的长度,因为IP头部可能包含不定长的选项信息。
  • 服务类型:用于指示数据包的服务质量。
  • 总长度:指整个IP包的长度,包括头部和数据。
  • 标识、标志、片偏移:这些字段与IP分片有关。
  • 生存时间(TTL):每经过一个路由器,TTL减1,当TTL为0时,包被丢弃,防止包在网络中无限循环。
  • 协议:指明了IP包携带的数据使用的是哪种传输层协议,例如TCP(协议号6)或UDP(协议号17)。
  • 头部校验和:用于检查IP头部在传输过程中是否被损坏。
  • 源地址IP目标地址IP:分别表示发送方和接收方的IP地址。
image-20240320091455936
  • 多网卡情况下的源地址选择

当一台主机拥有多个网络接口(网卡)时,每个接口都可能有自己的IP地址。在这种情况下,选择哪个IP地址作为IP包的源地址取决于主机的路由策略。

操作系统维护了一张路由表,这张表包含了不同目的地址对应的最佳下一跳及其出口接口(网卡)。当一个IP包需要发送时,操作系统会查看这张路由表,根据目的IP地址找到最合适的出口接口,然后使用这个接口的IP地址作为源地址。

路由表中的规则可以基于多种因素设置,如目的IP地址、子网掩码、网关、接口优先级等。在有多个可能的出口接口时,通常会根据特定的路由协议或策略(如最短路径、最小成本、带宽最大等)来决定使用哪个接口的IP地址作为源地址。

简而言之,多网卡主机上IP头部的源地址选择是根据操作系统的路由表和路由策略来确定的,旨在确保数据包能够通过最佳路径发送到目的地。

利用route -n命令查看路由表,并根据这些信息确定使用哪个网络接口发送IP包。

image-20240320092156480

举个例⼦,根据上⾯的路由表,我们假设 Web 服务器的⽬标地址是 192.168.10.200 。

image-20240320092339555
  1. 对于目的地址是192.168.10.200的情况
    • 操作系统会遍历路由表,对每一条规则进行匹配尝试。
    • 在第二条规则中找到匹配成功的情况,因为当目的地址192.168.10.200与子网掩码( Genmask )进行AND运算后,得到的网络地址是192.168.10.0,与路由表中的目的地地址相匹配。
    • 因此,操作系统会选择eth1网络接口的IP地址作为源IP地址。
  2. 对于目的地址是10.100.20.100的情况
    • 同样的,操作系统会尝试匹配路由表中的规则。
    • 由于前面的规则都不匹配,操作系统会使用默认路由规则,即目的地和子网掩码都是0.0.0.0的那一条。
    • 这表示,如果没有任何特定的路由可以匹配,就会使用这条默认路由。数据包会被发送到默认网关(Gateway)地址,而选择的网络接口将基于能够到达该网关的接口。
  • IP报文生成

    ⾄此,⽹络包的报⽂如下图。

    image-20240320095244543

此时,加上了 IP 头部的数据包表示 :“有 IP ⼤佬给我指路了,感谢 IP 层给我加上
了 IP 包头,让我有了远程定位的能⼒!不会害怕在浩瀚的互联⽹迷茫了!可是⽬的
地好远啊,我下⼀站应该去哪呢?”

两点传输 —— MAC

在TCP/IP网络中,当IP数据包准备发送到局域网上的另一台设备时,它需要被封装在一个以太网帧中。这就是为什么IP包在发送之前需要添加一个MAC头部。MAC(媒体访问控制)地址是网络接口卡(NIC)的物理地址,用于网络层以下的通信。

  • MAC头部的结构

以太网帧的MAC头部主要包括以下部分:

  1. 目标MAC地址:接收方设备的MAC地址,占用6字节。这个地址指示了帧的最终接收者。
  2. 源MAC地址:发送方设备的MAC地址,也占用6字节。这告诉接收设备,帧是从哪里来的。
  3. 协议类型:表明帧中携带的是什么类型的数据,占用2字节。对于大多数TCP/IP数据,这个字段通常是0x0800,表示携带的是IP协议数据。如果是ARP请求或应答,这个字段则是0x0806
image-20240320095820405
  • 数据传输流程
  1. 数据封装:在数据包从网络层(IP层)传输到数据链路层(MAC层)时,会被封装在一个以太网帧中。此时,IP头部已经存在,MAC头部被添加到IP头部之前。
  2. 地址解析:为了填充MAC头部中的目标MAC地址,设备可能需要执行ARP(地址解析协议)查询,除非目标MAC地址已经在本地ARP缓存中。ARP协议可以将目标设备的IP地址映射为其MAC地址。
  3. 发送帧:带有完整MAC头部的帧通过物理介质(如电缆、无线等)发送给目标设备。在同一局域网内,目标设备的网络接口会识别到自己的MAC地址,然后接收并处理帧内的数据。
  4. 数据解封装:接收设备在数据链路层接收到帧后,会解封装,移除MAC头部,然后根据协议类型将数据上交给网络层(例如,IP层)处理。

通过这种方式,MAC地址和头部在网络中实现了从一点到另一点的物理传输。虽然IP协议负责在整个互联网中路由数据包,但在局域网内的实际物理传输则依赖于MAC地址。

  • MAC 发送⽅和接收⽅如何确认?

发送方的MAC地址很容易确定,因为它储存在网络接口卡(NIC)的ROM中。但是,确定接收方的MAC地址则需要通过地址解析协议(ARP)来实现。

  1. 确定发送目标:首先,发送方需要确定数据包应该发送给谁。这通常通过查看路由表来完成,路由表指示了不同目的IP地址或IP网络对应的下一跳(gateway)的IP地址。
  2. 使用ARP寻找MAC地址
    • 如果目的地在同一个局域网(LAN)内,发送方需要目的IP地址对应的MAC地址。
    • 如果目的地不在同一局域网内,发送方需要知道下一跳(通常是网关)的MAC地址。
  3. ARP请求:发送方使用ARP协议通过网络广播一个请求,询问“哪台设备拥有这个IP地址?”这个请求包含了目的IP地址,并且被发送到局域网上的所有设备。
  4. ARP响应:拥有该IP地址的设备识别到这个ARP请求是询问自己的IP地址,于是它会回应一个ARP响应,告诉请求方它的MAC地址。
  5. 更新ARP缓存:接收到ARP响应后,发送方会将响应中的IP地址和MAC地址映射信息存储到自己的ARP缓存中。ARP缓存保存了局域网内其他设备的IP地址到MAC地址的映射,以便将来发送数据时直接查阅,而不需要再次广播ARP请求。
  6. 发送数据:一旦获取到了目的MAC地址,发送方就可以在以太网帧的MAC头部填入接收方(或下一跳网关)的MAC地址,并通过物理网络发送数据。

通过这种方式,ARP协议解决了IP网络层到以太网数据链路层地址的转换问题,允许TCP/IP网络上的设备能够在物理网络上进行通信。

  • 好像每次都要⼴播获取,这不是很麻烦吗?

虽然ARP查询是必要的过程来解析IP地址到对应的MAC地址,但每次需要通信时都进行广播查询确实会很低效,尤其是在流量较大的网络环境中。为了优化这个过程,操作系统使用了ARP缓存。

ARP缓存工作原理

  1. 缓存存储:当通过ARP获得一个IP地址对应的MAC地址后,操作系统将这个映射信息存储在ARP缓存中。这样,下次需要向同一个IP地址发送数据时,就可以直接从ARP缓存中读取MAC地址,而无需再次进行ARP广播查询。
  2. 缓存有效期:ARP缓存中的项并不是永久保存的。为了处理网络配置的变化(例如,设备更换了网络接口卡,获得了新的MAC地址),缓存项有一个过期时间。这个时间通常是几分钟到几个小时,不同的操作系统和配置可能会有所不同。
  3. 缓存更新:如果在缓存有效期内收到了新的ARP响应,缓存中对应的条目会被更新。同样,如果尝试使用缓存中的MAC地址发送数据但失败了(例如,因为目标设备已经不在网络上),那么相关的缓存条目会被标记为无效并可能被新的ARP查询和响应所更新。

查看ARP缓存

  • 在Linux系统中,arp -a命令可以显示当前ARP缓存的内容,包括每个缓存条目的IP地址、MAC地址、类型(如动态或静态)等信息。
  • image-20240320101525441

⾄此,⽹络包的报⽂如下图。

image-20240320101551148

此时,加上了 MAC 头部的数据包万分感谢,说道 :“感谢 MAC ⼤佬,我知道我下
⼀步要去哪了!我现在有很多头部兄弟,相信我可以到达最终的⽬的地!”。
带着众多头部兄弟的数据包,终于准备要出⻔了。

出⼝ —— ⽹卡

网络包的发送过程涉及到多个步骤,从最初的数据包在应用层生成,经过传输层、网络层的封装,最终到达数据链路层,即以太网层,这里就是网卡发挥作用的地方。网卡,也称为网络接口卡(NIC),是计算机连接网络的硬件设备,负责将数字信息转换为电信号,以便通过网络媒介(如双绞线、光纤、无线电波等)进行传输。

网卡的作用

  • 数字信号转换:网卡的核心功能是将计算机产生的数字数据转换为适合在物理媒介上传输的信号。对于有线网络,这通常意味着将数字信号转换为电信号;对于无线网络,则是转换为无线电波。
  • 数据帧的准备和封装:在发送数据前,网卡会在数据包的开头加上以太网帧头部和起始帧分界符(SFD),在数据包的末尾添加帧校验序列(Frame Check Sequence, FCS)。FCS是一种错误检测码,用于检测数据在传输过程中是否发生了变化或损坏。

image-20240320102231117

负责执⾏这⼀操作的是⽹卡,要控制⽹卡还需要靠⽹卡驱动程序。网卡驱动程序是操作系统用来管理和控制网卡硬件的软件。它负责处理操作系统和网卡之间的通信,包括数据的发送和接收。

  • 数据的发送过程
  1. 获取网络包:网卡驱动程序从操作系统获取准备发送的数据包。⽹卡驱动获取⽹络包之后,会将其复制到⽹卡内的缓存区中。
  2. 帧封装:数据包被封装在一个以太网帧中,帧的头部包含了目标和源MAC地址,以及其他控制信息。起始帧分界符(SFD)标记了帧的开始,帧校验序列(FCS)添加到帧的末尾,用于错误检测。
  3. 信号转换和发送:网卡将封装好的帧转换为适合通过物理媒介传输的信号(电信号或无线电波),然后发送出去。
  4. 错误检测:接收方的网卡会使用FCS来检查接收到的数据包是否在传输过程中被损坏。如果检测到错误,根据所使用的协议,接收方可能会请求发送方重传数据包。

最后⽹卡会将包转为电信号,通过⽹线发送出去。

唉,真是不容易,发⼀个包,真是历经千⾟万苦。致此,⼀个带有许多头部的数据终于踏上寻找⽬的地的征途了!

送别者 —— 交换机

交换机是网络中的核心设备之一,工作在数据链路层(MAC层),负责将网络包根据MAC地址表转发到局域网内正确的设备。其处理网络包的过程如下:

  1. 接收电信号:交换机的端口接收到电信号,类似于计算机网卡的操作,将电信号转换成数字信号。
  2. 错误检测:利用包末尾的帧校验序列(FCS)检查数据包是否在传输过程中损坏。如果数据包没有问题,它将被放入缓冲区等待进一步处理。
  3. MAC地址表查询:每个交换机维护一个MAC地址表,记录了哪些MAC地址通过哪个端口接入。收到一个数据包后,交换机检查包的目的MAC地址,查找自己的MAC地址表以确定应该通过哪个端口转发该包。

区别与网卡的处理方式

  • 网卡检查接收到的包是否是发给自己的MAC地址,如果不是,则丢弃该包。相比之下,交换机不会丢弃非直接发送给自己的包,而是根据MAC地址表进行转发或广播。

未知MAC地址的处理

  • 广播:如果目标MAC地址在地址表中找不到,交换机会将数据包广播到除了接收该数据包的端口以外的所有端口,确保信息能够到达正确的设备。这种广播方式保证了新设备能够被识别,同时也是处理未知目的地址的标准方式。
  • 学习机制:当设备响应广播的数据包时,交换机会“学习”该设备的MAC地址和对应的端口,将这个信息添加到自己的MAC地址表中,以便将来直接将数据包转发到正确的端口,减少不必要的广播。

广播地址的特殊处理

  • 对于广播地址(MAC地址为FF:FF:FF:FF:FF:FF或IP地址为255.255.255.255)的数据包,交换机会将其发送到所有端口(除了接收端口),确保网络上的所有设备都能收到这些特殊的数据包。

通过这种方式,交换机在局域网内高效地转发数据包,同时通过学习和更新MAC地址表来优化网络流量,减少不必要的广播,提高网络的整体性能。虽然广播可能会暂时增加网络负载,但交换机的学习机制确保了网络的有效运行,并不会导致长期的网络拥塞。

交换机的 MAC 地址表主要包含两个信息:
⼀个是设备的 MAC 地址,
另⼀个是该设备连接在交换机的哪个端⼝上。

image-20240320103534909

举个例⼦,如果收到的包的接收⽅ MAC 地址为 00-02-B3-1C-9C-F9 ,则与图中表中的第 3
⾏匹配,根据端⼝列的信息,可知这个地址位于 3 号端⼝上,然后就可以通过交换电路将包
发送到相应的端⼝了。
所以,交换机根据 MAC 地址表查找 MAC 地址,然后将信号发送到相应的端⼝。

数据包通过交换机转发抵达了路由器,准备要离开⼟⽣⼟⻓的⼦⽹了。此时,数据包
和交换机离别时说道:“感谢交换机兄弟,帮我转发到出境的⼤⻔,我要出远⻔啦!”

出境⼤⻔ —— 路由器

路由器和交换机在网络中扮演着各自独特但又相互补充的角色。他们的主要区别在于工作层级、功能以及在网络中的应用。以下是路由器和交换机之间的几个关键区别:

工作层级

  • 交换机:工作在数据链路层(第二层),也就是MAC层,直接使用MAC地址来转发数据帧到目的地。交换机主要用于处理同一个局域网(LAN)内的数据传输,提高了网络内部的通信效率。
  • 路由器:工作在网络层(第三层),基于IP地址进行工作。路由器能够连接不同的网络,如连接多个局域网或将局域网(LAN)连接到广域网(WAN)。它负责确定数据包从源头到目的地的最佳路径。

功能

  • 交换机:主要负责网络内部的数据交换,通过MAC地址表决定数据帧的转发。它能够增加网络的带宽,减少数据包的碰撞,提高局域网内数据传输的效率。
  • 路由器:除了负责数据包的路由选择和转发外,路由器还提供了网络之间的连接功能,如NAT(网络地址转换)、DHCP(动态主机配置协议)服务以及防火墙功能。路由器使不同网络之间的设备能够相互通信。

IP地址和MAC地址

  • 交换机:虽然交换机主要工作在数据链路层,但它并不直接使用IP地址进行数据传输。交换机端口本身不分配IP地址,但是管理交换机的目的(如配置VLAN)可能需要IP地址。
  • 路由器:每个路由器接口都分配有IP地址和MAC地址,使其能够在网络层上识别和处理IP数据包。路由器利用IP地址来决定如何将数据包从一个网络路由到另一个网络。

数据处理

  • 交换机:交换机接收到数据帧后,会查找MAC地址表,决定是否及如何转发该帧。如果目的MAC地址未知,交换机会广播该帧到所有其他端口(除了接收端口)。
  • 路由器:接收到数据包后,路由器检查目的IP地址,并根据路由表来决定下一跳的地址。然后,路由器将数据包封装在一个新的数据帧中,并设置新的目的MAC地址,通过相应的接口发送出去。

总之,路由器和交换机虽然在处理数据包和帧的方式上存在差异,但它们共同确保了数据在网络中的高效、准确传输。路由器提供了网络之间的连接和路径选择,而交换机则优化了同一网络内的数据流。

  • 查询路由表确定输出端⼝

完成包接收操作之后,路由器就会去掉包开头的 MAC 头部。
MAC 头部的作⽤就是将包送达路由器,其中的接收⽅ MAC 地址就是路由器端⼝的 MAC 地
址。因此,当包到达路由器之后,MAC 头部的任务就完成了,于是 MAC 头部就会被丢弃。
接下来,路由器会根据 MAC 头部后⽅的 IP 头部中的内容进⾏包的转发操作。

转发操作分为⼏个阶段,⾸先是查询路由表判断转发⽬标。

image-20240320105232744

具体的⼯作流程根据上图,举个例⼦。
假设地址为 10.10.1.101 的计算机要向地址为 192.168.1.100 的服务器发送⼀个包,这个包先到达图中的路由器。

判断转发⽬标的第⼀步,就是根据包的接收⽅ IP 地址查询路由表中的⽬标地址栏,以找到相匹配的记录。

路由匹配和前⾯讲的⼀样,每个条⽬的⼦⽹掩码和 192.168.1.100 IP 做 & 与运算后,得到
的结果与对应条⽬的⽬标地址进⾏匹配,如果匹配就会作为候选转发⽬标,如果不匹配就继
续与下个条⽬进⾏路由匹配。

如第⼆条⽬的⼦⽹掩码 255.255.255.0 与 192.168.1.100 IP 做 & 与运算后,得到结果是
192.168.1.0 ,这与第⼆条⽬的⽬标地址 192.168.1.0 匹配,该第⼆条⽬记录就会被作为
转发⽬标。

实在找不到匹配路由时,就会选择默认路由,路由表中⼦⽹掩码为 0.0.0.0 的记录表示「默
认路由」。

  • 路由器的发送操作

路由器的发送操作涉及多个步骤,旨在将数据包准确地从一个网络传输到另一个网络。这个过程不仅涉及到IP层的路由决策,也包括了数据链路层的MAC地址处理。以下是路由器发送操作的具体分析:

  1. 路由决策
    • 路由器首先查看自己的路由表,决定数据包的下一跳地址。路由表中包含了目的IP网络、下一跳网关的IP地址、使用的接口等信息。
    • 如果路由表中指定了网关IP地址,则该地址是下一跳的目标,说明数据包还需要通过更多的路由器进行转发。
    • 如果网关列为空或指定直接交付,说明目的地是直接可达的,目的IP地址位于同一局域网内。
  2. ARP查询
    • 知道了下一跳的IP地址后,路由器需要确定如何在数据链路层向该地址发送数据包。这就需要通过ARP协议查询下一跳的MAC地址。
    • 路由器会首先在自己的ARP缓存中查找是否已经有下一跳IP地址对应的MAC地址。如果有,就直接使用这个MAC地址。如果没有,路由器会发起ARP查询,通过广播询问下一跳IP地址对应的MAC地址是什么。
    • 一旦收到ARP响应,路由器就知道了下一跳的MAC地址,并将这个信息存入ARP缓存中以供将来使用。
  3. 封装并发送
    • 路由器将数据包封装在一个新的以太网帧中,设置帧的目的MAC地址为下一跳路由器的MAC地址,源MAC地址为发送端口的MAC地址。
    • 在以太网帧的类型字段中填入0x0800,表示携带的是IP协议数据。
    • 然后,路由器将这个以太网帧转换为电信号,通过物理接口发送出去。
  4. 交换机转发
    • 发送出去的数据包首先会到达局域网内的交换机。交换机根据自己的MAC地址表,将数据包转发到连接下一跳路由器的端口。
  5. 层层转发至目的地
    • 数据包可能会经过多个路由器的转发,直到最终到达目标网络。在每一跳中,源IP和目标IP地址保持不变,但是每次跨越网络时,MAC地址会根据下一跳进行更新。

在整个过程中,IP地址用于在网络层进行端到端的通信路径决策,而MAC地址则用于在同一局域网内或点对点的物理传输。这种分层的设计使得网络通信既灵活又高效,允许数据包通过复杂的网络结构从源头到达目的地。

数据包通过多个路由器道友的帮助,在⽹络世界途经了很多路程,最终抵达了⽬的地
的城⻔!城⻔值守的路由器,发现了这个⼩兄弟数据包原来是找城内的⼈,于是它就
将数据包送进了城内,再经由城内的交换机帮助下,最终转发到了⽬的地了。数据包
感慨万千的说道:“多谢这⼀路上,各路⼤侠的相助!”

互相扒⽪ —— 服务器 与 客户端

数据包抵达了服务器,服务器肯定⾼兴呀,正所谓有朋⾃远⽅来,不亦乐乎?
服务器⾼兴的不得了,于是开始扒数据包的⽪!就好像你收到快递,能不兴奋吗?

image-20240320110940161
  • 数据包的接收与处理(服务器端)
  1. MAC头部检查:数据包到达服务器后,服务器网卡检查MAC头部,确认数据包是发给自己的(即MAC地址匹配)。
  2. IP头部处理:移除MAC头部后,服务器检查IP头部,验证IP地址是否匹配,确认数据包是发往服务器的IP地址。
  3. TCP头部解析:接下来,服务器处理TCP头部,检查序列号以确保数据包的顺序正确,并通过端口号确定数据包是发往哪个服务或应用程序。
  4. 应用层处理:TCP头部处理完毕后,数据传递给相应的应用程序,例如HTTP服务器。HTTP服务器解析HTTP请求,然后准备HTTP响应。
  • 响应的发送(服务器端)
  1. 构造响应:HTTP服务器构造响应报文,包括所请求的网页或其他数据。
  2. 封装过程:HTTP响应报文随后被封装在TCP段中,添加TCP头部;接着封装在IP包中,添加IP头部;最后封装在以太网帧中,添加MAC头部。
  3. 路由转发:经过网卡发送出去的数据包,通过局域网中的交换机和路由器,经过多跳路由选择,最终到达客户端
  • 响应的接收与处理(客户端)
  1. 数据包解封装:客户端接收到数据包后,从底层到上层逐层移除头部,最终得到HTTP响应内容。

  2. 渲染页面:浏览器取得HTTP响应内容,解析HTML、CSS、JavaScript等资源,渲染出网页。

  • 连接的断开
  1. TCP四次挥手:当客户端完成数据的接收后,它会通过TCP的四次挥手过程与服务器断开连接,以确保双方都正确关闭了连接。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/485885.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

封装函数实现一维数组输入、输出以及冒泡排序

1. 代码 #include <stdio.h>int InputArray(int *pa, int len) {int i 0;for (i 0; i < len; i){scanf("%d", &pa[i]);}return 0; }int OutputArray(int *pa, int len) {int i 0;for (i 0; i < len; i){printf("%-2d ", pa[i]);}putc…

中标,我们是认真的!菊风再携手吉林银行打造智能双录系统

当前&#xff0c;数字化发展步伐持续加快&#xff0c;各个金融机构纷纷按下数字化转型的加速键&#xff0c;陆续推进数字化发展战略&#xff0c;加快数字金融建设。近期&#xff0c;吉林银行面对业务快速发展的需要&#xff0c;服务效率、人力成本等挑战日益凸显&#xff0c;逐…

YOLOv5全网独家改进: 注意力机制改进 | 并行化注意力设计(PPA)模块,红外小目标暴力涨点 | 2024年3月最新成果

💡💡💡本文独家改进:红外小目标涨点利器,在多个数据集下进行验证,其中并行化 patch-aware 注意力(PPA)模块,解决目标的大小微小以及红外图像中通常具有复杂的背景的问题点 💡💡💡红外小目标实现暴力涨点,只有几个像素的小目标识别率大幅度提升 改进结构图如…

MySQL的基本操作与增删改查管理操作

一、MySQL数据库sql语句 1.1 sql 命令 database数据库table表row行column列user用户select从数据表中获取数据updata更新数据库中的数据delete从数据库中删除数据insert into 向数据表插入数据create database创建新数据库alter database修改数据库create table创建新表alter…

第八节:深入讲解SMB中的Http组件

一、概述 Http组作是SMB中的核心组件之一&#xff0c;在第七节中讲解了如何简洁的进行web程序部署和运行&#xff0c;这只是它的功能之一。在本节中&#xff0c;我们将介绍Http组件的重要属性。 二、请求头Request 1、支持方法 支持POST、GET、PUT、DELETE、OPTIONS等方法&a…

AI数字人“搅局”直播电商

现如今&#xff0c;直播带货已然成为了备受消费者欢迎的一种新的购物模式&#xff0c;人们已经愈发习惯在直播间购物了。在直播带货热度居高不下背后&#xff0c;除了低价优势之外&#xff0c;还在于直播带货所具备的实时互动、全方位展示能够为消费者带去更加真实、直观、沉浸…

Java集合框架初学者指南:List、Set与Map的实战训练

Java集合框架是Java语言的核心部分&#xff0c;它提供了丰富的类和接口&#xff0c;用来高效地管理和操作大量数据。这个强大的工具箱包括多种集合类型&#xff0c;其中最为常用的是List、Set和Map。 1.List - 有序且可重复的数据清单 概念&#xff1a; List就像一个购物清单&…

python usb与下位机 硬件通信

需求分析 上周接到一个需求 用usb和硬件连接 轮询读取usb中指定功能码的指定个数的数据并生成一个桌面程序 刚接到这个需求时 我第一时间想到的就是使用python去尝试 期间也踩了很多的坑 第一版效果如下 特此记录 环境搭建 首先第一点就是将所需要的库进行安装 这里是我这…

Springboot2 restTemplate 使用UriComponentsBuilder时编码问题

文章目录 简要说明maven依赖样例代码 简要说明 在使用springboot2的restTemplate配合UriComponentsBuilder&#xff0c;UriComponentsBuilder拿到uri字符串时有编码过程&#xff0c;而restTemplate在execute时&#xff0c;底层也是有encode编码&#xff0c;这样就到时了双重编…

基于ssm的校园驿站管理系统论文

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对校园快递信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差…

详解机器学习概念、算法

目录 前言 一、常见的机器学习算法 二、监督学习和非监督学习 三、常见的机器学习概念解释 四、深度学习与机器学习的区别 基于Python 和 TensorFlow 深度学习框架实现简单的多层感知机&#xff08;MLP&#xff09;神经网络的示例代码&#xff1a; 欢迎三连哦&#xff01; 前言…

LeetCode 1027——最长等差数列

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 假设我们以 f[d][nums[i]]表示以 nums[i] 为结尾元素间距为 d 的等差数列的最大长度&#xff0c;那么&#xff0c;如果 nums[i]-d 也存在于 nums 数组中&#xff0c;则有&#xff1a; f [ d ] [ n u m s [ i ] ] …

我们是如何测试人工智能的(八)包含大模型的企业级智能客服系统拆解与测试方法 -- 大模型 RAG

大模型的缺陷 -- 幻觉 接触过 GPT 这样的大模型产品的同学应该都知道大模型的强大之处&#xff0c; 很多人都应该调戏过 GPT&#xff0c;跟 GPT 聊很多的天。 作为一个面向大众的对话机器人&#xff0c;GPT 明显是鹤立鸡群&#xff0c;在世界范围内还没有看到有能跟 GPT 扳手腕…

武汉星起航引领跨境电商新纪元,助力卖家扬帆远航全球市场

在全球化的商业浪潮中&#xff0c;跨境电商行业异军突起&#xff0c;成为连接全球市场的重要纽带。亚马逊&#xff0c;作为全球零售电商的巨擘&#xff0c;为无数卖家提供了走向国际市场的广阔舞台。在这片充满机遇与挑战的蓝海中&#xff0c;武汉星起航电子商务有限公司以其独…

数字孪生技术在农业领域的应用

数字孪生技术在农业领域的应用&#xff0c;不仅能够提高农业生产的智能化水平&#xff0c;还能够促进农业资源的高效利用和农业环境的可持续发展。随着技术的不断进步和应用的深入&#xff0c;数字孪生将在农业领域发挥越来越重要的作用。数字孪生技术在农业领域的应用主要集中…

redis连接工具 windows版安装和redis命令

Redis是一个开源的使用C语言编写、支持网络、基于内存、可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。 一、redis-windows版安装 在D盘符下新建个目录&#xff0c;把下载的绿色安装包放在该目录。 D:\Files Java\Redis-x64-3.2.100 解压到当前目录 …

跳蚱蜢(蓝桥杯)

文章目录 跳蚱蜢题目描述答案&#xff1a;20bfs 跳蚱蜢 题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 如下图所示&#xff1a; 有 9 只盘子&#xff0c;排成 1 个圆圈。 其中 8 只盘子内装着 8 只蚱蜢&#xff…

【单例测试】Mockito实战

目录 一、项目介绍二、业务代码2.1 导入依赖2.2 entity2.3 Dao2.4 业务代码 三、单元测试3.1 生成Test方法3.2 引入测试类3. 3 测试前准备3.4 测试3.4.1 name和phone参数校验3.4.2 测试数据库访问 3.4.3 数据库反例 总结 前面我们提到了《【单元测试】一文读懂java单元测试》 简…

【Redis教程0x04】详解Redis的4个高级数据类型

引言 在【Redis教程0x03】中&#xff0c;我们介绍了Redis中常用的5种基础数据类型&#xff0c;我们再来回顾一下它们的使用场景&#xff1a; String&#xff1a;存储对象、url、计数、分布式锁&#xff1b;List&#xff1a;消息队列&#xff1b;Hash&#xff1a;存储对象、购…

【Arxml专题】-29-使用Cantools将CAN Matrix Arxml自动生成C语言代码

目录 1 安装Python和Cantools 1.1 查看Python已安装的Package包 1.2 在Python中安装Cantools插件包 1.3 获取更多Cantools工具的更新动态 2 CAN Matrix Arxml自动生成C语言代码 2.1 批处理文件CAN_Matrix_Arxml_To_C.bat内容说明 2.2 CAN Matrix Arxml文件要求 2.3 如何…
最新文章