网络编程基础(1)

计算机网络

计算机网络的标准定义是:利用通信线路将地理上分散的、具有独立功能的计算机系统
和通信设备按不同的形式连接起来,以功能完善的网络软件及协议实现资源共享和信息传递
的系统。

分类

计算机网络从覆盖范围上划分可以分为三类:局域网、城域网、广域网。局域网 LAN(作
用范围一般为几米到几十公里)、城域网 MAN(界于 WAN 与 LAN 之间)、广域网 WAN(作用
范围一般为几十到几千公里)。当然计算机网络划分不止这一种分类方式,可以按拓扑结构
分类(总线型、环型、星型、网状)、还可以按按信息的交换方式(电路交换、报文交换、
报文分组交换)来分等等方式。

体系与结构

开放系统互连参考模型 (Open System Interconnect 简称 OSI)是国际标准化组织(ISO)
和国际电报电话咨询委员会(CCITT)联合制定的开放系统互连参考模型,为开放式互连信息系
统提供了一种功能结构的框架。其目的是为异种计算机互连提供一个共同的基础和标准框架,
并为保持相关标准的一致性和兼容性提供共同的参考。这里所说的开放系统,实质上指的是
遵循 OSI 参考模型和相关协议能够实现互连的具有各种应用目的的计算机系统。
OSI 采用了分层的结构化技术,共分七层,即iso7层:物理层、数据链路层、网络层、传输层、会
话层、表示层、应用层。

在这里插入图片描述

OSI 模型比较复杂且学术化,所以我们实际使用的 TCP/IP 模型,分 5 层,物理层、数据
链路层(也有 TCP/IP 模型将物理层、数据链路层合称为网络接口层,与之对应的,协议就
被称为 TCP/IP 四层协议模型)、网络层、传输层、应用层。两个模型之间的对应关系如图
所示:

在这里插入图片描述

无论什么模型,每一个抽象层建立在低一层提供的服务上,并且为高一层提供服务。大
致来说,可以这么理解(只是帮助我们理解,实际上肯定会有点出入),对于我们的 PC 机
来说,物理层可以看成网卡,数据链路层可以看成网卡驱动程序,网络层和传输层由操作负
责处理,应用层则是常用的一些网络应用程序和我们自己所编写的网络应用程序。

基础网络协议

我们最常见的底层网络协议TCP/IP:

Transmission Control Protocol/Internet Protocol 的简写,中译名为传输控制协议/因特网
互联协议,是 Internet 最基本的协议、Internet 国际互联网络的基础,由网络层的 IP 协议和
传输层的 TCP 协议组成。协议采用了 5 层的层级结构。然而在很多情况下,它是利用 IP 进
行通信时所必须用到的协议群的统称。也就是说,它其实是个协议家族,由很多个协议组成,
并且是在不同的层, 是互联网的基础通信架构。

在这里插入图片描述
在上述图形中,网际协议 IP 是 TCP/IP 中非常重要的协议,往往用来确定网络中唯一的
一台计算设备,它的作用就好比我们现实生活中的电话号码或者或者通讯地址。所以这层负
责对数据加上 IP 地址(有发送它的主机的地址(源地址)和接收它的主机的地址(目的地
址))和其他的数据以确定传输的目标。 而 TCP 和 UDP 都是传输层的协议,传输层主要为两台主机上的应用程序提供端到端的通信。

TCP

TCP 有点类似于我们日常生活中的打电话,电话接通后通过“喂”确认对方身份,听不
清会要求对方重说,对方说的太快了会要求对方说慢点,讲完了各说一句“再见”结束通话。
TCP 提供了一种可靠的数据传输服务,TCP 是面向连接的,也就是说,利用 TCP 通信的两台
主机首先要经历一个建立连接的过程,等到连接建立后才开始传输数据,而且传输过程中采 用“带重传的肯定确认”技术来实现传输的可靠性。TCP 还采用一种称为“滑动窗口”的方式进
行流量控制,发送完成后还会关闭连接。

TCP连接与断开流程

连接存在着客户端和服务端两者角色,在网络通信里是怎么区分的?
这个就牵涉到了 TCP 的相关特性。
TCP(Transmission Control Protocol)是面向连接的通信协议,通过三次握手建立连接,
然后才能开始数据的读写,通讯完成时要拆除连接,由于 TCP 是面向连接的所以只能用于端
到端的通讯。

TCP 提供的是一种可靠的数据流服务,数据有可能被拆分后发送,那么采用超时重传机
制是和应答确认机制是组成 TCP 可靠传输的关键设计。
超时重传机制中最最重要的就是重传超时(RTO,Retransmission TimeOut)的时间选
,很明显,在工程上和现实中网络环境是十分复杂多变的,有时候可能突然的抽风,有时
候可能突然的又很顺畅。在数据发送的过程中,如果用一个固定的值一直作为超时计时器的
时长是非常不经济也非常不准确的方法,这样的话,超时的时长就需要根据网络情况动态调
整,就需要采样统计一个数据包从发送端发送出去到接收到这个包的回复这段时长来动态设
置重传超时值,这个时长就是为 RTT,学名 round-trip time,然后再根据这个 RTT 通过各种
算法和公式平滑 RTT 值后,最终确定重传超时值。

而 IP 层进行数据传输时,是不能保证数据包按照发送的顺序达到目的机器。当 IP 将把
它们向‘上’传送到 TCP 层后,TCP 将包排序并进行错误检查。TCP 数据包中包括序号和确认,
所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。

TCP 还采用一种称为**“滑动窗口”**的方式进行流量控制,所谓窗口实际表示接收能力,用
以限制发送方的发送速度。
同时 TCP 还允许在一个 TCP 连接上,通信的双方可以同时传输数据,也就是所谓的全
双工。

面向连接的服务(例如 Telnet、FTP、rlogin、X Windows 和 SMTP)需要高度的可靠性,
所以它们使用了 TCP。DNS 在某些情况下使用 TCP(发送和接收域名数据库),但使用 UDP
传送有关单个主机的信息。

三次握手

TCP 提供面向有连接的通信传输。面向有连接是指在数据通信开始之前先做好两端之间
的准备工作。

所谓三次握手是指建立一个 TCP 连接时需要客户端和服务器端总共发送三个包以确认
连接的建立。在 socket 编程中,这一过程由客户端执行 connect 来触发,所以网络通信中,
发起连接的一方我们称为客户端,接收连接的一方我们称之为服务端。

在这里插入图片描述
第一次握手:客户端将请求报文标志位 SYN 置为 1,请求报文的 Sequence Number 字段
(简称 seq)中填入一个随机值 J,并将该数据包发送给服务器端,客户端进入 SYN_SENT 状
态,等待服务器端确认。

第二次握手:服务器端收到数据包后由请求报文标志位 SYN=1 知道客户端请求建立连
接,服务器端将应答报文标志位 SYN 和 ACK 都置为 1,应答报文的 Acknowledgment Number
字段(简称 ack)中填入 ack=J+1,应答报文的 seq 中填入一个随机值 K,并将该数据包发送
给客户端以确认连接请求,服务器端进入 SYN_RCVD 状态。

第三次握手:客户端收到应答报文后,检查 ack 是否为 J+1,ACK 是否为 1,如果正确
则将第三个报文标志位 ACK 置为 1,ack=K+1,并将该数据包发送给服务器端,服务器端检
查 ack 是否为 K+1,ACK 是否为 1,如果正确则连接建立成功,客户端和服务器端进入
ESTABLISHED 状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。

四次挥手

四次挥手即终止 TCP 连接,就是指断开一个 TCP 连接时,需要客户端和服务端总共发
送 4 个包以确认连接的断开。在 socket 编程中,这一过程由客户端或服务端任一方执行 close
来触发。

在这里插入图片描述
1、某个应用进程首先调用 close,我们称该端执行主动关闭(active close)。该端的 TCP
于是发送一个 FIN 分节,表示数据发送完毕,应用进程进入 FIN-WAIT-1(终止等待 1)状态。

2、接收到这个 FIN 的对端执行被动关闭(passive close),发出确认报文。因为 FIN 的接
收意味着接收端应用进程在相应连接上再无额外数据可接收,接收端进入了 CLOSE-WAIT(关
闭等待)状态,这时候处于半关闭状态,即主动关闭端已经没有数据要发送了,但是被动关
闭端若发送数据,主动关闭端依然要接受。这个状态还要持续一段时间,也就是整个
CLOSE-WAIT 状态持续的时间。主动关闭端收到确认报文后进入 FIN-WAIT-2(终止等待 2)状
态。

3、一段时间后,被动关闭的应用进程将调用 close 关闭它的套接字。这导致它的 TCP 也
发送一个 FIN,表示它也没数据需要发送了。

4、接收这个最终 FIN 的原发送端 TCP(即执行主动关闭的那一端)确认这个 FIN 发出一
个确认 ACK 报文,并进入了 TIME-WAIT(时间等待)状态。注意此时 TCP 连接还没有释放,
必须经过 2∗MSL(最长报文段寿命/最长分节生命期 max segement lifetime,MSL 是任何 IP
数据报能够在因特网中存活的最长时间,任何 TCP 实现都必须为 MSL 选择一个值。RFC
1122[Braden 1989]的建议值是 2 分钟,不过源自 Berkelcy 的实现传统上改用 30 秒这个值。
这意味着 TIME_WAIT 状态的持续时间在 1 分钟到 4 分钟之间)的时间后,当主动关闭端撤
销相应的 TCB 后,才进入 CLOSED 状态。

5、 被动关闭端只要收到了客户端发出的确认,立即进入 CLOSED 状态。同样,撤销 TCB
后,就结束了这次的 TCP 连接。可以看到,被动关闭端结束 TCP 连接的时间要比主动关闭
端早一些。既然每个方向都需要一个 FIN 和一个 ACK,因此通常需要 4 个分节。我们使用限定词“通
常”是因为:某些情形下步骤 1 的 FIN 随数据一起发送;另外,步骤 2 和步骤 3 发送的分节
都出自执行被动关闭那-一端,有可能被合并成一个分节。

UDP

UDP(User Datagram Protocol 的简称, 中文名是用户数据报协议)有点类似于我们日常生活中通过不靠谱的物流系统寄东西。UDP 是把数据直接发出去,而不管对方是不是在接 收,也不管对方是否能接收的了,也不需要接收方确认,属于不可靠的传输,可能会出现丢包现象,实际应用中要求程序员编程验证。所以 TCP 要比 UDP 可靠的多。

注意

我们一些常见的网络应用基本上都是基于 TCP 和 UDP 的,这两个协议又会使用网络层
的 IP 协议。但是我们完全可以绕过传输层的 TCP 和 UDP,直接使用 IP,比如 Linux 内核中的
LVS 就可以直接基于 IP 层进行负载平衡调度;甚至还可以直接访问链路层,比如 tcpdump
程序就是直接和链路层进行通信的。

网络数据传输流程

每个分层中,都会对所发送的数据附加一个首部,在这个首部中包含了该层必要的信息,
如发送的目标地址以及协议相关信息。通常,为协议提供的信息为包首部,所要发送的内容
为数据。在下一层的角度看,从上一层收到的包全部都被认为是本层的数据。
网络中传输的数据包由两部分组成:一部分是协议所要用到的首部,另一部分是上一层
传过来的数据。首部的结构由协议的具体规范详细定义。在数据包的首部,明确标明了协议
应该如何读取数据。反过来说,看到首部,也就能够了解该协议必要的信息以及所要处理的
数据。我们用用户 A 发送,用户 B 接受来说说明:

1、 用户 A 应用程序处理
首先应用程序会进行编码处理产生报文/消息(message)交给下面的 TCP 层。

2、 用户 A TCP 模块的处理
TCP 根据应用的指示,负责建立连接、发送数据以及断开连接。TCP 提供将应用层发来的
数据顺利发送至对端的可靠传输。为了实现这一功能,需要将应用层数据封装为报文段
(segment)并附加一个 TCP 首部然后交给下面的 IP 层。

3、用户 A IP 模块的处理
IP 将 TCP 传过来的 TCP 首部和 TCP 数据合起来当做自己的数据,并在 TCP 首部的前端
加上自己的 IP 首部生成 IP 数据报(datagram)然后交给下面的数据链路层。

4、 用户 A 数据链路层的处理
从 IP 传过来的 IP 包对于数据链路层来说就是数据。给这些数据附加上链路层首部封装为
链路层帧(frame),生成的链路层帧(frame)将通过物理层传输给接收端。

5、用户 B 数据链路层的处理
用户 B 主机收到链路层帧(frame)后,首先从链路层帧(frame)首部找到 MAC 地址判断
是否为发送给自己的包,若不是则丢弃数据。
如果是发送给自己的包,则从以太网包首部中的类型确定数据类型,再传给相应的模块,如
IP、ARP 等。这里的例子则是 IP 。

6、 用户 B IP 模块的处理
IP 模块接收到 数据后也做类似的处理。从包首部中判断此 IP 地址是否与自己的 IP 地址
匹配,如果匹配则根据首部的协议类型将数据发送给对应的模块,如 TCP、UDP。这里的例
子则是 TCP。

7、 用户 B TCP 模块的处理
在 TCP 模块中,首先会计算一下校验和,判断数据是否被破坏。然后检查是否在按照序号
接收数据。最后检查端口号,确定具体的应用程序。数据被完整地接收以后,会传给由端口
号识别的应用程序。

8、 用户 B 应用程序的处理
接收端应用程序会直接接收发送端发送的数据。通过解析数据,展示相应的内容。

在这里插入图片描述

使用wireshark抓包可以看到每一层的数据例如:segment、datagram、frame。
请添加图片描述

IP、MAC地址与端口号

IP与MAC地址

IP 地址(Internet Protocol Address)的全称叫作互联网协议地址,它的本义是为互联网
上的每一个网络和每一台主机配置一个唯一的逻辑地址,用来与物理地址作区分。
所以 IP 地址用来识别 TCP/IP 网络中互连的主机和路由器。IP 地址基于逻辑,比较灵
活,不受硬件限制,也容易记忆。
IP 地址分为:IPv4 和 IPv6。我们这里着重讲的是 IPv4 地址,IP 地址是由 32 位的二进制
数组成,它们通常被分为 4 个“8 位二进制数”,我们可以把它理解为 4 个字节,格式表示
为:(A.B.C.D)。其中,A,B,C,D 这四个英文字母表示为 0-255 的十进制的整数。例:
192.168.1.1
Tips:IP 地址和 MAC 地址之间的区别
1、对于网络中的一些设备,路由器或者是 PC 及而言,IP 地址的设计是出于拓扑设计
出来的,只要在不重复 IP 地址的情况下,它是可以随意更改的;而 MAC 地址是根据生产厂
商烧录好的,它一般不能改动的,一般来说,当一台 PC 机的网卡坏了之后,更换了网卡之
后 MAC 地址就会变了。

2、在前面的介绍里面,它们最明显的区别就是长度不同,IP 地址的长度为 32 位,而
MAC 地址为 48 位。

3、它们的寻址协议层不同。IP 地址应用于 OSI 模型的网络层,而 MAC 地址应用在 OSI
模型的数据链路层。 数据链路层协议可以使数据从一个节点传递到相同链路的另一个节点
上(通过 MAC 地址),而网络层协议使数据可以从一个网络传递到另一个网络上(ARP 根
据目的 IP 地址,找到中间节点的 MAC 地址,通过中间节点传送,从而最终到达目的网络)。

4、分配依据不同。IP 地址的分配是基于我们自身定义的网络拓扑,MAC 地址的分配是
基于制造商。

端口号

在传输层也有这种类似于地址的概念,那就是端口号。端口号用来识别同一台计算机中
进行通信的不同应用程序。因此,它也被称为程序地址。
一台计算机上同时可以运行多个程序。传输层协议正是利用这些端口号识别本机中正在
进行通信的应用程序,并准确地将数据传输。

在这里插入图片描述
为什么端口号有 65535 个?
因为在 TCP、UDP 协议报文的开头,会分别有 16 位二进制来存储源端口号和目标端口
号,所以端口个数是 2^16=65536 个,但是 0 号端口用来表示所有端口,所以实际可用的端
口号是 65535 个。

在这里插入图片描述
所以一般来说,不管计算机中有多少网卡,每个网卡都会有自己的 MAC 地址,这个
MAC 地址是不会变化的。而每个网卡在正常工作的情况下,都会有一个 IP 地址,这个 IP
地址完全是可以变化的。而这台计算机中承载的各种应用程序可以拥有自己的端口号,然后
通过服务器的网卡,正确地进行网络通信。
一台服务器上的不同网络应用程序必须有不同的端口号,A 程序启动了使用了端口 x, B 程序启动就不能使用端口 x,否则会报错“Address already in use”。
总的来说,操作系统是通过源 IP 地址、目标 IP 地址、协议号(协议类型)、源端口号
以及目标端口号这五个元素唯一性的识别一个网络上的通信。

在这里插入图片描述

从 TCP 连接四元组来考虑:源 IP 地址、源端口、目的 IP 地址和目的端口,目的 IP 地址
和目的端口指的是服务器的 IP 和端口,源 IP 地址、源端口自然就是客户端的。
只要服务器的 IP 或者端口不一样,即使客户端的 IP 和端口是一样的。这个四元组也
是属于一条完全不同的新连接。

从浏览器输入IP地址一直到能访问经过流程

当 X 同学首先将其笔记本 PC 与网络连接时,没有 IP 地址他就不能做任何事
情。所以,X 同学的笔记本 PC 所采取的一个网络相关的动作是运行 DHCP 协议,
以从本地 DHCP 服务器获得一个 IP 地址以及其他信息。

名称解释 DHCP:动态主机配置协议,为一个新接入的主机分配一个 IP 地 址。

1、X 同学笔记本 PC 上的操作系统生成一个 DHCP 请求报文,并将这个
报文放入 UDP 报文段,该 UDP 报文段则被放置在一个具有广播 IP 目的地址
(255.255.255.255)和源 IP 地址 0.0.0.0 的 P 数据报中,因为 X 同学的笔记本 PC
还没有一个 IP 地址。

2、包含 DHCP 请求报文的 IP 数据报则被放置在以太网帧中。该以太网帧具
有目的 MAC 地址 FF:FF:FF:FF:FF:FF,使该帧将广播到与交换机连接的所有设备;
该帧的源 MAC 地址是 X 同学笔记本 PC 的 MAC 地址 11:22:33:44:55:66。

3、包含 DHCP 请求的广播以太网帧是第一个由 X 同学笔记本 PC 发送到以
太网交换机的帧。该交换机在所有的出端口广播入帧,包括连接到路由器的端口。

4、路由器在它的具有 MAC 地址 22:33:44:55:66:11 的接口接收到该广播以太
网帧,该帧中包含 DHCP 请求,并且从该以太网帧中抽取出 IP 数据报。该数据报
的广播 IP 目的地址指示了这个 IP 数据报应当由在该节点的高层协议处理,因此
该数据报的载荷(一个 UDP 报文段)被分解向上到达 UDP,DHCP 请求报文从此
UDP 报文段中抽取出来。此时 DHCP 服务器有了 DHCP 请求报文。

5、假设 DHCP 服务器分配地址 192.168.5.10 给 X 同学的笔记本 PC。DHCP 服
务器生成包含这个 IP 地址以及 DNS 服务器的 IP 地址(120.69.56.46)、默认网关
路由器的 IP 地址(192.168.5.1)和子网掩码(255.255.255.0)的一个 DHCP ACK 报
文。
该 DHCP 报文被放入一个 UDP 报文段中,UDP 报文段被放入一个 IP 数据报
中,IP 数据报再被放入一个以太网帧中。这个以太网帧的目的 MAC 地址是 X 同 学笔记本 PC 的 MAC 地址(11:22:33:44:55:66)。

6、包含 DHCP ACK 的以太网帧由路由器发送给交换机。因为交换机是自学
习的,并且先前从 X 同学笔记本 PC 收到(包含 DHCP 请求的)以太网帧,所以
该交换机知道寻址到 11:22:33:44:55:66 的帧仅从通向 X 同学笔记本 PC 的输出端
口转发。

7、 X 同学笔记本 PC 接收到包含 DHCP ACK 的以太网帧,从该以太网帧中抽
取 IP 数据报,从 IP 数据报中抽取 UDP 报文段,从 UDP 报文段抽取 DHCP ACK 报
文。X 同学 的 DHCP 客户则记录下分配给它的 IP 地址和它的 DNS 服务器的 IP
地址。它还在其 IP 转发表中安装默认网关的地址。
X 同学笔记本 PC 将向该默认网关发送目的地址为其子网 192.168.5.X 以外的
所有数据报。

名词解释DNS: Domain Name System,专门提供将主机名转换为其背后
的 IP 地址,DNS 协议运行在 UDP 之上,使用 53 号端口。

当 X 同学 将 www. baidu. com 的 URL 键入其 Web 浏览器时,X 同学笔记本
PC 需要知道 www. baidu. com 的 IP 地址。
8、 X 同学笔记本 PC 上的操作系统因此生成一个 DNS 查询报文,将字符串
www. baidu. com 放入 DNS 报文中,该 DNS 报文则放置在 UDP 报文段中。该 UDP
报文段则被放入具有IP目的地址120.69.56.46(在第5步中 DHCP ACK返回的 DNS
服务器地址)和源 IP 地址 192.168.5.10 的 IP 数据报中。

9、X同学笔记本PC则将包含DNS请求报文的数据报放入一个以太网帧中。
该帧将发送(在链路层寻址)到 X 同学公司网络中的网关路由器。然而,即使 X
同学笔记本 PC 经过上述第 5 步中的 DHCP ACK 报文知道了公司网关路由器的 IP
地址(192.168.5.1),但仍不知道该网关路由器的 MAC 地址(尽管网关路由器
和 DHCP 服务器是同一个路由器,但是 X 同学笔记本 PC 并不知道,而且实际生
活中,DHCP 服务器和网关路由器可能是分开的)。为了获得该网关路由器的
MAC 地址,X 同学笔记本 PC 将需要使用 ARP 协议。

名称解释:ARP 协议,地址解析(Address Resolution)协议,用以在同一个
子网内网络设备在网络层地址(如 IP 地址)和链路层地址(即 MAC 地址)之间
的转换,每台主机或路由器在其内存中具有一个 ARP 表( ARP table),这张表包
含 IP 地址到 MAC 地址的映射关系。RARP 以与 ARP 相反的方式工作,RARP 发
出要反向解析的物理地址并希望返回其对应的 IP 地址。

10、 X 同学笔记本 PC 生成一个具有目的 IP 地址 192.168.5.1(默认网关)
的 ARP 查询报文,将该 ARP 报文放置在一个具有广播目的地址(FF:FF:FF:FF:FF:FF)
的以太网帧中,并向交换机发送该以太网帧,交换机将该帧交付给所有连接的设
备,包括网关路由器。

11、网关路由器在通往公司网络的接口上接收到包含该 ARP 查询报文的帧,
发现在 ARP 报文中目标 IP 地址 192.168.5.1 匹配其接口的 IP 地址。网关路由器因
此准备一个 ARP 回答,报文中说明了本机的 MAC 地址 22:33:44:55:66:11 对应 IP
地址 192.168.5.1。它将 ARP 回答放在一个以太网帧中,其目的地址为
11:22:33:44:55:66 (X 同学笔记本 PC),并向交换机发送该帧,再由交换机将帧交
付给 X 同学笔记本 PC。

12、X 同学笔记本 PC 接收包含 ARP 回答报文的帧,并从 ARP 回答报文中抽
取网关路由器的 MAC 地址(22:33:44:55:66:11)。

13、X 同学笔记本 PC 现在能够使包含 DNS 查询的以太网帧寻址到网关路由
器的 MAC 地址。在该帧中的 IP 数据报具有 IP 目的地址 120.69.56.46 ( DNS 服务
器),而该帧具有目的 mac 地址 22:33:44:55:66:11(网关路由器),X 同学笔记
本 PC 向交换机发送该帧,交换机将该帧交付给网关路由器。

名词解释:NAT 网络地址转换
上面交付的数据帧中,IP 数据报内的源地址是 192.168.5.10(X 同学笔记本
IP),但是这不是一个 Internet 使用的 IP 地址,是一个私有 IP 地址,在局域网
中使用的 IP 地址(私有 IP 地址包括:10.0.0.0 ~ 10.255.255.255、172.16.0.0 ~
172.31.255.255、192.168.0.0 ~ 192.168.255.255)。
于是网关路由器会进行 NAT(网络地址转换),简单来说,NAT 路由器收到
运输层报文,为该数据报生成一个新的源端口号,假设为 5002,将源 IP
(192.168.5.10)替代为路由器广域网一侧接口的 IP 地址 120.68.34.89,且将报
文中本来的源端口更换为新端口 5002。当生成一个新的源端口号时,并在路由
器的 NAT 转换表进行记录。
应答服务器并不知道请求数据报已被 NAT 路由器进行了改装,它会发回一
个响应报文,其目的地址是 NAT 路由器的 IP 地址,其目的端口是 5002。当该报
文到达 NAT 路由器时,路由器使用目的 IP 地址与目的端口号从 NAT 转换表中检
索出 X 同学笔记本 IP 地址(192.168.5.10)和发出 DNS 报文时使用的端口号。于
是,路由器重写该数据报的目的 IP 地址与目的端口号,并向 X 同学笔记本转发
该数据报。
注意,后面的描述中,经由网关路由器在 Internet 和局域网内交换的报文都
默认进行了 NAT。

14、 网关路由器接收该帧并抽取包含 DNS 查询的 IP 数据报。路由器查找该
数据报的目的地址(120.69.56.46),并根据其转发表决定该数据报应当发送到
四川电信网络中 R1 路由器。IP 数据报放置在链路层帧中,并根据寻找出来的链
路发送。

15、在四川电信网络中 R1 路由器接收到该帧,抽取 IP 数据报,检查该数据
报的目的地址(120.69.56.46),并根据其转发表确定出接口,经过该接口朝着
DNS 服务器转发数据报。

16、最终包含 DNS 查询的 IP 数据报到达了本地电信 DNS 服务器。DNS 服务
器抽取出 DNS 查询报文,在它的 DNS 数据库中查找名字 www. baidu. com,找
到包含对应 www. baidu. com 的 IP 地址(14.215.177.38)的 DNS 源记录。该 DNS
服务器形成了一个包含这种主机名到 IP 地址映射的 DNS 回答报文,将该 DNS 回
答报文放入 UDP 报文段中,该数据报将通过四川电信网络反向转发到公司的路
由器,并从这里经过以太网交换机到 X 同学笔记本 PC。

17、X 同学笔记本 PC 从 DNS 报文抽取出服务器 www. baidu. com 的 IP 地
址。最终,在大量工作后,X 同学笔记本 PC 此时准备访问 www. baidu. com 服务
器。

18、既然 X 同学笔记本 PC 有了 www. baidu. com 的 IP 地址,它能够生成 TCP
套接字),该套接字将用于向 www. baidu. com 发送 HTTP GET 报文。
在 X 同学笔记本 PC 中的 TCP 必须首先与 www. baidu. com 中的 TCP 执行三
次握手。X 同学笔记本 PC 因此首先生成一个具有目的端口 80(针对 HTTP 的)
的 TCP SYN 报文段,将该 TCP 报文段放置在具有目的 IP 地址 14.215.177.38 ( www.
baidu. com)的 IP 数据报中,将该数据报放置在目的 MAC 地址为
22:33:44:55:66:11(网关路由器)的帧中,并向交换机发送该帧。

19、在公司网络、四川电信网络、北京电信网络和百度网络中的路由器朝着
www. baidu. com 转发包含 TCP SYN 的数据报,使用每台路由器中的转发表,如
前面步骤 14~16 那样。

20、最终,包含 TCP SYN 的数据报到达 www. baidu. com。从数据报抽取出
TCP SYN 报文并分解到与端口 80 相联系的欢迎套接字。对于百度 HTTP 服务器和
X 同学笔记本 PC 之间的 TCP 连接生成一个连接套接字。产生一个 TCP SYNACK 报
文段。

21、包含 TCP SYNACK 报文段的数据报通过百度、北京电信、四川电信和公 司网络,最终到达 X 同学笔记本 PC 的以太网卡。数据报在操作系统中分解到步
骤 18 生成的 TCP 套接字,从而进入连接状态。

22、借助于 X 同学笔记本 PC 上的套接字 socket,X 同学的浏览器生成包含
要获取的 URL 的 HTTP GET 报文。HTTP GET 报文则写入套接字,其中 GET 报文
成为一个 TCP 报文段的载荷。该 TCP 报文段放置进一个数据报中,并交付到 www.
baidu. com,如前面步骤 18~20 所述。

23、在 www. baidu. com 的 HTTP 服务器从 TCP 套接字读取 HTTP GET 报文,
生成一个 HTTP 响应报文,将请求的 Web 页内容放入 HTTP 响应体中,并将报文
发送进 TCP 套接字中。

24、包含 HTTP 回答报文的数据报通过百度网络、北京电信、四川电信 和
公司网络转发,到达 X 同学笔记本 PC。X 同学的 Web 浏览器程序从套接字读取
HTTP 响应,从 HTTP 响应体中抽取 Web 网页的 html,并最终显示了 Web 网页。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值