1. 简述四层TCP/IP 网络模型
由于 OSI 模型实在太复杂,提出的也只是概念理论上的分层,并没有提供具体的实现方案。
事实上,我们比较常见,也比较实用的是四层模型,即 TCP/IP 网络模型,
1.1 应用层
在四层TCP/IP网络模型中,应用层是最顶层的一层,它直接与用户交互,是用户与网络之间的接口。应用层的作用是为用户提供直接的网络服务接口,处理应用程序之间的通信,格式化数据,并管理会话。应用层传输的是应用程序生成的实际数据,以及用于通信控制的协议消息。
1.1.1 应用层的实际作用
-
提供应用程序接口:
- 应用层为用户和应用程序提供了直接与网络进行交互的接口。它定义了用于不同应用的网络协议,如HTTP、FTP、SMTP、DNS等。
- 例如,浏览器使用HTTP协议与Web服务器通信,邮件客户端使用SMTP协议发送电子邮件。
-
数据格式化和翻译:
- 应用层负责处理数据的格式化和翻译,使得不同计算机系统之间能够理解彼此的数据。它确保数据在不同的系统中能够被正确解释和展示。
-
管理会话:
- 应用层负责管理网络应用之间的会话,包括会话的建立、维护和终止。比如,当你访问一个网站时,应用层负责保持你和服务器之间的会话,直到你关闭浏览器或断开连接。
-
错误检测和处理:
- 应用层还可能包含一些简单的错误检测和处理机制,确保数据能够正确传输和处理。例如,当你在浏览器中输入错误的URL,应用层可能返回一个404错误页面。
1.1.2 应用层传输的内容
-
应用数据:应用层传输的是应用程序生成的实际数据。这些数据可以是多种形式的,包括:
- 网页数据(通过HTTP/HTTPS传输)
- 电子邮件内容(通过SMTP/IMAP/POP3传输)
- 文件(通过FTP或HTTP传输)
- 域名解析请求和响应(通过DNS传输)
- 即时消息(通过各种即时通信协议传输)
-
协议消息:除了应用数据,应用层还传输控制信息和协议消息,用于管理通信过程中的各种操作。例如,HTTP协议的请求和响应头部,包含了有关请求资源、状态码和内容类型等信息。
1.2 传输层
如果HTTP请求消息比较长,超过了MSS的长度,这时TCP就需要把HTTP 的数据拆解成一块块的数据发送,而不是一次性发送所有数据。
MTU : 一个网络包的最大长度,以太网中一般为1500字节。
MSS:除去IP和TCP头部之后,一个网络包所能容纳的TCP数据的最大长度。
数据会被以Mss的长度为单位进行拆分,拆分出来的每一块数据都会被放进单独的网络包中。也就是在每个被拆分的数据加上TCP头信息,然后交给IP模块来发送数据。
1.3 网络层
IP地址的两个主要作用:
1.3.1 一个是寻址:
-
IP地址的基本结构:
- IPv4地址总共有32位,分成了四段,每段8位,例如“192.168.100.1”。
- 如果只考虑整个IP地址作为一个单独的单位,虽然可以区分不同的设备,但在全世界范围内寻找某个特定设备就会变得非常麻烦,因为全球有非常多的设备。
-
IP地址的划分:
- 为了更科学地管理和查找设备,IP地址被划分成两部分:网络号和主机号。
- 网络号:标识这个IP地址属于哪个“子网”,也就是IP地址的前几位,用于区分不同的网络。
- 主机号:标识这个“子网”中的具体设备,也就是IP地址的后几位,用于区分同一子网内的不同设备。
-
子网掩码的作用:
- 为了区分网络号和主机号,需要使用子网掩码。子网掩码是一种32位的掩码,用于计算IP地址的哪一部分是网络号,哪一部分是主机号。
子网掩码取反后再按位与就是主机地址
- 为了区分网络号和主机号,需要使用子网掩码。子网掩码是一种32位的掩码,用于计算IP地址的哪一部分是网络号,哪一部分是主机号。
1.3.2 IP地址的另一个作用另一个是路由:
除了寻址能力,IP协议还有另一个重要的能力就是路由。实际场景中,两台设备并不是用一条网线连接起来的,而是通过很多网关、路由器、交换机等众多网络设备连接起来的,那么就会形成很多条网络的路径,因此当数据包到达一个网络节点,就需要通过路由算法决定下一步走哪条路径。
1.3.3 理解两个概念的差异
让我们用一个通俗的比喻来进一步解释这两个概念:
IP地址的寻址:找到目的地
IP地址的寻址就像是邮寄信件时,你在信封上写下收件人的完整地址。这个地址包括国家、省市、街道和门牌号。它唯一标识了你希望信件到达的具体位置。
- 比喻:IP地址就像信件上的邮寄地址。它告诉网络中其他设备,这个数据包最终要送到哪里。
IP地址的路由:决定路线和转发
路由的工作则是决定如何将信件(数据包)从寄件人的位置,通过一系列中间站,最终送达收件人的地址。每个中间站(路由器)都会根据信件上写的地址和自己的路由表,决定将信件转发给哪一个下一个中间站。
- 比喻:路由就像邮局工作人员在不同的邮局间传递信件。他们会根据信封上的地址决定信件的下一个邮局(转发路径)。如果你寄的是国际邮件,它可能会经过多个国家的多个邮局,直到最终到达目的地。
1.4 网络接口层
生成了IP头部之后,接下来要交给网络接口层(Link Layer)在IP头部的前面加上MAC头部,并封装成数据帧(Data frame)发送到网络上。
1.4.1 为什么需要IP地址和MAC地址
要理解IP地址和MAC地址的存在意义,可以把它们类比为邮寄系统中的两个不同步骤:一个是“找到正确的城市和街道”,另一个是“找到正确的房子”。
1.4.1.1 IP地址的作用
IP地址就像是你寄信时写的城市和街道地址。在网络中,IP地址用于标识全球范围内的网络位置。这意味着它能够在更大的网络(如互联网)中,帮助路由器和其他设备确定数据包的“大方向”,即哪个网络或哪个子网(如一个公司或一个家庭)应该接收到这个数据包。
- 举例:假设你要寄一封信到某个城市的某条街道。IP地址就像你写在信封上的城市和街道信息,邮局根据这些信息将信送到目标城市的指定街道。
1.4.1.2 MAC地址的作用
MAC地址则更像是具体的房屋号码。即使你的信已经到达了正确的城市和街道,还需要进一步确定具体要送到哪一栋房子。这时,MAC地址就发挥了作用。MAC地址是设备的硬件地址,每个网络设备(如电脑、手机、路由器)都有一个唯一的MAC地址,用来标识局域网内的具体设备。
- 举例:当邮差已经把信送到了指定的街道(即网络中的局域网),他还需要根据门牌号(MAC地址)找到正确的房子(设备),然后将信送到你手里。
1.4.1.3 为什么需要两个地址
- IP地址:用于在全球范围内找到正确的“街道”或“网络”。它解决了跨网络(如从一个城市到另一个城市,从一个公司到另一个公司)的数据包传输问题。
- MAC地址:用于在局域网内找到具体的“房子”或“设备”。它解决了在一个局域网内部,数据包应该传输到哪个具体设备的问题。
1.4.1.4 以太网的工作原理
在以太网中,设备之间通过MAC地址进行直接通信。当一个数据包进入局域网后,它就不再依赖IP地址来寻找目标,而是通过MAC地址来确定最终要发送到的设备。
所以说,网络接口层主要为网络层提供「链路级别」传输的服务,负责在以太网、WiFi这样的底层网络上发送原始数据包,工作在网卡这个层次,使用MAC地址来标识网络上的设备。
2. 当键入网址后,到网页显示,其间发生了什么
2.1 解析URL并生成HTTP消息
URL(Uniform Resource Locator),即统一资源定位符,是用来指定互联网上某一资源位置的字符串。URL通常是我们在浏览器地址栏中输入的链接,用于访问网站的特定页面或资源。
URL的组成部分
一个完整的URL通常包含以下几个部分:
-
协议(Scheme):
- 指定使用的网络协议,如
http
、https
、ftp
等。常见的http
和https
分别代表超文本传输协议和安全超文本传输协议。 - 例如:
https://
- 指定使用的网络协议,如
-
域名(或IP地址):
- 指定目标服务器的地址,通常是一个域名(如
www.example.com
)或者IP地址。 - 例如:
www.example.com
- 指定目标服务器的地址,通常是一个域名(如
-
端口号(可选):
- 指定用于连接服务器的端口号。如果省略,默认会使用协议的标准端口号(
http
默认端口是 80,https
默认端口是 443)。 - 例如:
:80
- 指定用于连接服务器的端口号。如果省略,默认会使用协议的标准端口号(
-
路径(Path):
- 指定服务器上的特定资源或文件的路径。
- 例如:
/docs/tutorial/index.html
-
查询字符串(Query String,可选):
- 提供附加信息,以键值对的形式传递给服务器。通常用于数据提交和动态页面内容请求。
- 例如:
?user=123&sort=asc
-
片段标识符(Fragment,可选):
- 指定页面内的一个位置或片段,浏览器会跳转到页面中的某个锚点。
- 例如:
#section2
URL的示例
一个完整的URL示例:
https://www.example.com:443/docs/tutorial/index.html?user=123&sort=asc#section2
在这个URL中:
- 协议是
https
- 域名是
www.example.com
- 端口号是
443
(HTTPS的默认端口) - 路径是
/docs/tutorial/index.html
- 查询字符串是
?user=123&sort=asc
- 片段标识符是
#section2
对URL进行解析之后,浏览器确定了Web服务器和文件名,接下来就是根据这些信息来生成HTTP请求消息了。
2.2 DNS解析域名得到IP地址
通过浏览器解析URL并生成HTTP消息后,需要委托操作系统将消息发送给web服务器。
但在发送之前,还有一项工作需要完成,那就是查询服务器域名对应的IP地址,因为委托操作系统发送消息时,必须提供通信对象的IP地址。
比如我们打电话的时候,必须要知道对方的电话号码,但由于电话号码难以记忆,所以通常我们会将对方电话号+姓名保存在通讯录里。
所以,有一种服务器就专门保存了Web服务器域名与IP 的对应关系,它就是DNS服务器。
2.2.1 DNS中的域名结构与解析
1. 域名中的句点
- 域名中的每个部分都是用句点(.)来分隔的。例如,
www.server.com
中的句点代表了不同层次之间的界限。
2. 域名层级的概念
- 在域名中,越靠右的位置表示层级越高。
3. 层级解释
- 因为域名是外国人发明的,域名层级的表示方式和中国人写地址的方式相反。外国人喜欢从小到大的顺序来描述位置(如
XX街道 XX区 XX市 XX省
),而中国人则习惯从大到小来描述(如XX省 XX市 XX区 XX街道
)。
4. 根域与顶级域
- 实际上,域名最后还有一个点。例如,
www.server.com.
,这个最后的句点代表根域名。
-虽然从技术上讲根域名点是存在的,但在用户界面上,这个细节被隐含处理,以简化用户操作和提升使用体验。
- .(根域)是在最顶层,其下一层是.com(顶级域),再下面是server.com。
5. 域名的层级结构图解
- 域名的层级关系类似于树状结构:
- 根DNS服务器(.
.
) - 顶级域DNS服务器(
.com
) - 权威DNS服务器(
server.com
)
- 根DNS服务器(.
通过这种层次结构,每一层都能逐步缩小范围,最终找到具体的服务器地址,实现从域名到IP地址的解析。
2.2.2 域名解析的工作流程
-
客户端发起请求:
- 当你在浏览器中输入
www.server.com
时,客户端会向本地的DNS服务器发出请求,询问这个域名对应的IP地址是什么。(本地DNS服务器地址是预先配置在你的计算机中的)
- 当你在浏览器中输入
-
本地DNS服务器的缓存查询:
- 本地DNS服务器接收到请求后,会首先查看自己的缓存中是否有
www.server.com
的IP地址。 - 有缓存:如果有缓存记录,直接返回IP地址。
- 无缓存:如果没有缓存,本地DNS服务器会向根域名服务器请求帮助。
- 本地DNS服务器接收到请求后,会首先查看自己的缓存中是否有
-
向根域名服务器询问:
- 根域名服务器是整个DNS系统的最高层次,它不直接提供域名解析,但会指引本地DNS去哪里找答案。
- 本地DNS向根域名服务器询问:“根域名服务器,
www.server.com
这个域名对应的IP地址在哪里可以找到?”
-
根域名服务器的指引:
- 根域名服务器发现
.com
是域名的顶级域,告诉本地DNS:“这个域名属于.com
区域管理,你可以去问.com
顶级域名服务器。”
- 根域名服务器发现
-
向顶级域名服务器查询:
- 本地DNS接收到顶级域名服务器的地址后,再次发起请求:“顶级域名服务器,能告诉我
www.server.com
的IP地址在哪里吗?”
- 本地DNS接收到顶级域名服务器的地址后,再次发起请求:“顶级域名服务器,能告诉我
-
顶级域名服务器的回复:
- 顶级域名服务器负责管理
.com
这一大类域名,它会告诉本地DNS:“去问负责www.server.com
这个具体域名的权威DNS服务器,它知道答案。”
- 顶级域名服务器负责管理
-
向权威DNS服务器查询:
- 本地DNS最后将请求转发给
www.server.com
对应的权威DNS服务器:“能告诉我www.server.com
的IP地址吗?” - 权威DNS 是最终负责特定域名解析结果的服务器,它管理着这个域名的记录。
- 本地DNS最后将请求转发给
-
权威DNS服务器返回IP地址:
- 权威DNS服务器查找到
www.server.com
对应的IP地址,比如192.168.1.1
,并将结果告诉本地DNS。 - 本地DNS接收到IP地址后,将它返回给客户端,客户端随后使用这个IP地址与目标服务器建立连接。
- 权威DNS服务器查找到
2.2.3 为什么需要这种层次化访问 来回的信息传输不是浪费了很多网络资源么 为什么不在根域存放所有网址对应的IP地址?
DNS 系统之所以采用层次化结构,而不是在根域存放所有网址对应的 IP 地址,有几个关键原因:
1. 可扩展性
- 全球范围的互联网规模:互联网上有数十亿个域名,如果所有域名的 IP 地址都存储在根域服务器上,根域服务器将需要处理巨大的数据量。这不仅会让根域服务器负载过重,还会导致管理和维护上的困难。
- 层次化分布:通过将 DNS 系统层次化,将责任分配给各级 DNS 服务器,可以有效地分散负载。每一层级只需管理自己范围内的域名,而不必关心所有的域名。
2. 灵活性与自治性
- 自治管理:各个域名的管理权限分散到不同的权威 DNS 服务器上。例如,某个公司可以自己管理与其域名相关的 DNS 记录,而不需要依赖根域服务器的管理。这种分布式管理允许不同组织、公司、甚至个人能够独立管理自己的域名,提供了更大的灵活性。
- 动态更新:域名和 IP 地址的对应关系是动态的,经常会发生变化。如果所有这些更新都集中在根域服务器上,会导致根域服务器频繁更新,效率低下。通过分布式管理,域名的更新可以在局部进行,而无需影响整个系统。
3. 性能与效率
- 缓存机制:本地 DNS 服务器、ISP 提供的 DNS 服务器等都可以缓存 DNS 查询结果。这意味着一旦一个域名被解析过,下次再查询时可以直接使用缓存的结果,而不必再次经过层级查询。这大大减少了网络资源的消耗和查询时间。
- 减少延迟:层次化结构让每一步查询更接近目标服务器,减少了全网广播的需求。在分布式的系统中,通过层次化查询可以快速找到负责特定域名的 DNS 服务器,而不需要逐个检查所有可能的服务器。
4. 安全性
- 分散风险:集中式的根域服务器如果遭遇攻击或故障,可能会导致大规模的网络中断。分层结构将域名解析责任分散到多个节点上,降低了单点故障的风险,同时也提高了抵御分布式拒绝服务(DDoS)攻击的能力。
5. 历史与技术限制
- 设计初衷:DNS 系统在设计时,互联网规模还远没有今天这么庞大,但设计者预见到了未来的扩展需求,因此采用了分层结构来保证系统的可扩展性和可维护性。
虽然 DNS 的层次化查询在表面上看似增加了通信开销,但通过分布式管理、缓存机制、灵活性和安全性等优点,实际提高了整个互联网系统的效率和可靠性。如果所有域名的 IP 地址都集中存储在根域服务器上,反而会导致更严重的网络资源浪费和潜在的性能瓶颈。
2.3 协议栈接手传输工作
理解协议栈和它在TCP/IP架构中的位置
协议栈(Protocol Stack)是计算机网络中用于处理网络通信的一系列协议的集合。在TCP/IP架构中,协议栈指的是一组分层的协议,每一层都负责网络通信过程中的不同部分。协议栈存在于TCP/IP的每一层。
2.3.1 协议栈在这张图中的位置
在这张图中,协议栈位于操作系统部分的中间位置。它包括了多种协议,如:
- TCP 和 UDP:这两个协议负责在网络上传输数据。TCP是面向连接的,确保数据包按照顺序到达;UDP是无连接的,传输速度快,但不保证数据包顺序。
- IP:负责将数据包从一个网络传输到另一个网络,决定数据如何在网络间路由。
- ICMP 和 ARP:分别用于网络诊断和将IP地址转换为物理地址。
2.3.2 协议栈的作用
当你在浏览器中访问一个网站时,应用程序(如浏览器)首先会生成数据(如HTTP请求)。这个数据会通过Socket库传递给操作系统中的协议栈。协议栈会分层处理这个数据:
- 传输层(TCP/UDP):为数据增加传输协议头(如TCP头),确保数据能够正确传输。
- 网络层(IP):为数据增加IP头,确定数据包的目的地。
- 数据链路层(ARP):将IP地址转换为物理地址(MAC地址),以便通过网络硬件(如网卡)传输。
最终,这些经过层层封装的数据会通过网络驱动程序传输到硬件(如网卡),然后发送到网络中。
2.4 TCP实现可靠传输
HTTP 是基于 TCP 协议传输的,所以在这我们先了解下 TCP 协议。
TCP报文头部的格式如图:
让我们结合这张图详细解释一下每个部分的作用,并用通俗的方式来理解。
-
源端口号和目标端口号(16位):
- 源端口号表示数据是从哪个应用程序发出的。
- 目标端口号表示数据要发送到哪个应用程序。
- 通俗理解:就像寄包裹时需要写上发件人和收件人的地址一样,端口号就是用来标明“哪个应用程序发送”和“要送到哪个应用程序”的“地址”。
-
序号(32位):
- 序号是用来标记每个数据包的顺序,以防止数据包乱序。
- 通俗理解:如果你把一本书的内容拆成很多信件发送,每个信件上都需要标上页码,以便收件人能按顺序把信件拼成一本书。
-
确认序列号(32位):
- 确认序列号是用来确认之前的数据包是否成功收到。
- 通俗理解:每当你收到一封信后,你会给寄信人回一封确认信,告诉对方“我收到了第X页的信件,请继续发下一页”。
-
首部长度(4位)和保留位(6位):
- 这些字段的主要作用是记录一些关于数据包的额外信息或留作将来扩展使用。
-
状态位(如SYN、ACK、RST、FIN等,1位):
- 这些标志位用来控制连接的状态。
- SYN:请求建立连接。
- ACK:确认已经收到数据。
- RST:请求重置连接。
- FIN:请求终止连接。
- 通俗理解:状态位就像交通信号灯,它告诉双方什么时候该发数据,什么时候该停下来,什么时候该结束这次传输。
- 这些标志位用来控制连接的状态。
-
窗口大小(16位):
- 窗口大小决定了发送方在没有收到确认信号前能发送的最大数据量,用于控制流量。
- 通俗理解:想象你有一个信箱,信箱只能容纳一定数量的信件。如果对方一次性寄来的信件太多,信箱放不下,这些信件就会丢失。所以,窗口大小就是你告诉对方“我的信箱一次最多能放多少信”。
-
校验和(16位):
- 校验和用于检查数据包在传输过程中是否被篡改或损坏。
- 通俗理解:这就像在寄包裹前,你先把包裹称了重量,收到包裹时你再称一遍。如果重量不对,那就说明包裹在途中被损坏或篡改过。
-
紧急指针(16位):
- 这个字段用来标记紧急数据,告诉接收方应该优先处理这部分数据。
- 通俗理解:如果你寄了一封非常紧急的信件,你会在信封上写上“紧急处理”,这样对方收到后会优先打开这封信。
-
选项:
- 选项字段是一个可选的扩展部分,可以用来传输额外的控制信息。
- 通俗理解:这是信封上的附加说明,比如“此信件不得折叠”或“请在白天投递”。
-
数据:
- 这是实际要传输的数据内容。
- 通俗理解:这就是信件的正文部分,即你真正要传达的信息。
2.4.1 传输数据前的三次握手
结合这张图,我来用更通俗的方式解释“三次握手”:
1. 初始状态
- 服务端和客户端都处于CLOSE状态。就像两个人都还没准备好打电话。
- 服务端开始监听一个端口(例如准备好接电话),进入LISTEN状态,等待有人打电话。
2. 第一次握手(客户端发出SYN)
- 客户端想要发起连接,所以它发送一个SYN(同步信号),表示:“我要打电话了,准备接听。”此时客户端进入SYN-SENT状态,等待服务端的回应。
- 这个SYN包里包含了一个序号(Seq Num),用于标识本次通信连接的起点。
Tips: Seq Num 是用来标识数据包的序列号。每个TCP连接在开始时,客户端和服务端都会生成一个初始序号,称为初始序列号(ISN, Initial Sequence Number)。这个序号并不是从0开始,而是一个随机生成的数值,以确保连接的唯一性和安全性。
当客户端发送SYN包时,Seq Num标识了这个连接的初始序号(client_isn),但此时实际还没有数据被发送,只是用这个序号来标记连接的起点。
3. 第二次握手(服务端回复SYN + ACK)
- 服务端收到客户端的SYN信号,确认有人要打电话,回复一个SYN + ACK(确认信号)。意思是:“好的,我准备好了,顺便告诉你我已经收到了你的请求,并且也附上我的序号。”服务端进入SYN-RCVD状态,表示收到了请求并发回了确认。
- 服务端发送的包包含两个信息:
- SYN:告诉客户端“我也准备好通信了”。
- ACK:确认收到客户端的SYN,并附上客户端的序号+1(类似于“我收到了你发的第一个包”)。
- 服务端同时也生成了自己的序号(Seq Num)。
4. 第三次握手(客户端确认ACK)
- 客户端收到服务端的SYN + ACK后,确认“服务端已经准备好了”,并向服务端发送最后一个ACK包,意思是:“我知道你已经收到了我的请求,并且我也收到了你的确认信息,现在我们可以正式通信了。”此时客户端进入ESTABLISHED状态,表示连接已经建立。
- ACK包中包含服务端的序号+1,表示客户端确认收到了服务端的响应。
5. 最终确认(服务端收到ACK)
- 服务端收到客户端最后的ACK后,也进入了ESTABLISHED状态。现在双方都可以正式通信了。
总结
- 三次握手的目的:保证双方都有发送和接收数据的能力,确保通信是可靠的。就像双方打电话前,确认对方都听得清楚,电话线路没问题,然后才开始正式通话。
- 图中的每一步都表示了一个状态转换,保证数据包的顺序和确认,避免出现通信错误或数据丢失。
通过这个比喻,三次握手就像两个人打电话前的确认过程,确保双方都在线并准备好接收对方的信息。
2.4.2 如何查看TCP连接状态
在 Windows 中查看 TCP 连接状态
1. 使用 netstat
命令
netstat
是 Windows 上内置的网络工具,可以查看网络连接状态。
-
查看所有连接状态
netstat -an
这会列出所有的网络连接,包括TCP和UDP连接,以及每个连接的状态(如
ESTABLISHED
,LISTENING
)。 -
过滤特定状态的连接(例如 ESTABLISHED)
netstat -an | find "ESTABLISHED"
只显示处于
ESTABLISHED
状态的TCP连接。 -
查看特定端口的连接
netstat -an | find ":<port_number>"
显示与指定端口相关的连接。
2. 使用 PowerShell
你也可以使用 PowerShell 来查看TCP连接状态。
-
查看所有连接状态
Get-NetTCPConnection
这会显示所有TCP连接及其状态。
-
过滤特定状态的连接(例如 ESTABLISHED)
Get-NetTCPConnection -State Established
在 Linux 中查看 TCP 连接状态
1. 使用 netstat
命令
netstat
是 Linux 上经典的网络工具。
-
查看所有TCP连接状态
netstat -at
这会列出所有的TCP连接及其状态。
-
查看特定端口的连接状态
netstat -an | grep <port_number>
显示与指定端口相关的所有连接状态。
-
查看正在监听的端口
netstat -tuln
显示所有正在监听的TCP和UDP端口。
2. 使用 ss
命令
ss
是比 netstat
更现代化的工具,通常在较新的Linux系统上使用。
-
查看所有TCP连接状态
ss -t -a
列出所有TCP连接及其状态。
-
查看正在监听的端口
ss -t -l
显示所有正在监听的TCP端口。
-
过滤特定状态的连接(例如 ESTABLISHED)
ss -t state ESTABLISHED
3. 使用 lsof
命令
lsof
(list open files)可以显示系统中打开的文件,包括网络连接。
- 查看特定端口的连接状态
显示与指定端口相关的网络连接。lsof -i :<port_number>
4. 使用 tcpdump
命令
tcpdump
是一个网络包捕获工具,可以监控TCP连接的流量和状态。
- 捕获特定端口的TCP流量
捕获指定端口的TCP流量,适合深入分析连接状态。tcpdump -i <interface> tcp port <port_number>
通过这些工具和命令,你可以在Windows和Linux系统上查看并管理TCP连接状态。
2.5 IP实现远程定位
PTCP 模块在执行连接、收发、断开等各阶段操作时,都需要委托 IP 模块数据成IP报文发送给通信对象。
先看看IP报文头部格式:
在IP协议里面需要有源地址IP和目标地址IP:
源地址IP,即是客户端输出的IP地址;
目标地址,即通过DNS域名解析得到的 Web服务器IP。
因为HTTP是经过TCP传输的,所以在IP包头的协议号,要填写为06(十六进制),表示协议为TCP。
2.5.1 为何IP报文图中不包含TCP报文的任何信息?
IP报文与TCP报文的关系
IP报文头部主要描述与网络层传输相关的信息,并不会直接显示传输层(如TCP)的详细内容。TCP报文的内容被封装在IP报文的数据部分,并由IP头部的“协议”字段指示它是一个TCP报文。
-
IP报文的结构:
- IP报文的结构分为两个主要部分:
- IP头部:用于携带与网络层相关的信息,如源IP地址、目的IP地址、协议类型等。
- 数据部分(负载):包含更高层协议的数据(例如TCP、UDP、ICMP等)。
- IP报文的结构分为两个主要部分:
-
TCP报文的封装:
- 当IP模块收到一个TCP报文时,它会将这个TCP报文放入IP报文的数据部分。
- 在IP头部的 “协议(Protocol)” 字段中,IP报文会指定负载数据的类型。例如,对于TCP报文,这个字段的值通常为6,表示该IP报文的负载是TCP数据。
-
完整的数据包结构:
- 在传输过程中,一个完整的数据包可能会包括以下内容:
- 以太网帧头部(数据链路层)
- IP头部(网络层)
- TCP头部和数据(传输层)
也就是如下图:
- 在传输过程中,一个完整的数据包可能会包括以下内容:
2.6 MAC实现两点传输
生成了IP头部之后,接下来网络包还需要在IP头部的前面加上MAC头部。
一般在TCP/IP通信里,MAC包头的协议类型只使用:
0800 : IP协议
0806: ARP协议
ARP协议用于根据IP地址找到路由器的MAC地址:
至此,网络包的报文如下:
2.7 加完头部信息,利用网卡转换将数字信号为电信号在网线上传输
网络包只是存放在内存中的一串二进制数字信息,没有办法直接发送给对方。因此,我们需要将数字信息转换为电信号,才能在网线上传输,也就是说,这才是真正的数据发送过程。
负责执行这一操作的是网卡,要控制网卡还需要靠网卡驱动程序。
网卡驱动获取网络包之后,会将其复制到网卡内的缓存区中,接着会在其开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列。
2.8 再通过交换机转发
交换机的设计是将网络包原样转发到目的地。
由于交换机的端口不存在MAC地址,所以需要一张映射表:
此外,如果接收方 MAC 地址是一个广播地址,那么交换机会将包发送到除源端口之外的所有端口。
以下两个属于广播地址:
MAC地址中的FF:FF:FF:FF:FF :FF·
IP地址中的 255.255.255.255
2.9 再通过路由器转发
2.9.1 交换机与路由器的主要区别
交换机和子网的关系
-
同一个子网:交换机在数据链路层(第二层)工作,它只识别MAC地址,并不处理IP地址或子网划分的问题。这意味着,交换机所连接的所有设备必须在同一个子网中,才能正常通信。
-
原因:交换机的主要功能是基于MAC地址来转发数据包,而在同一个子网内,设备之间可以直接通过MAC地址找到对方。这就是为什么交换机适用于在一个局域网内分发数据。
对比路由器的作用
- 路由器的角色:如果你需要连接不同的子网或不同的网络(例如,本地网络和互联网),就需要使用路由器。路由器工作在网络层(第三层),处理IP地址,并能够跨越子网和不同网络转发数据。
通俗理解
-
交换机:就像一个办公室的内部分线器,连接办公室内的电话,只能在这个办公室内打电话。
-
路由器:就像办公室的总机,不仅可以在办公室内打电话,还可以接通外部的电话网络,让你与外界联系。
因此,交换机在同一个子网下工作,是网络中用于高效连接本地设备的工具。要跨越子网或连接不同网络,就必须通过路由器。
2.9.2 路由转发
完成包接收操作之后,路由器就会去掉包开头的 MAC 头部。
MAC 头部的作用就是将包送达路由器,其中的接收方 MAC 地址就是路由器端口的 MAC 地址。因此,当包到达路由器之后,MAC 头部的任务就完成了,于是 MAC 头部就会被丢弃。
接下来,路由器会根据 MAC 头部后方的 IP 头部中的内容进行包的转发操作。
具体的工作流程根据上图,举个例子。
假设地址为 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 的记录表示「默认路由」
tips:在图中,“跃点数”(Metric)是用来衡量一条路由的优先级的指标。简单来说,它表示路由器选择路径的成本或代价。
跃点数的作用
-
路径选择:当一台路由器需要将数据包从源地址传递到目标地址时,可能存在多条路径可供选择。跃点数用于衡量这些路径的优先级。通常,跃点数越小,路径的优先级越高,路由器会优先选择跃点数较小的路径来转发数据包。
-
成本的表示:跃点数可以基于各种因素进行设定,例如跳数、带宽、延迟、费用等。通常,跃点数为“1”表示这是一个直接的、低成本的路径。
图中跃点数的解读
在你上传的图中,所有的跃点数都是“1”,这表示这些路由的代价或成本相同。如果有多条路径可以到达同一个目标地址,路由器会根据其他因素(如接口、网关等)来决定最终使用哪条路径。
2.9.3 路由器的发送(网关的作用)
接下来就会进入包的发送操作。
首先,我们需要根据路由表的网关列判断对方的地址。
如果网关是一个 IP 地址,则这个IP 地址就是我们要转发到的目标地址,还未抵达终点,还需继续需要路由器转发。
如果网关为空,则 IP 头部中的接收方 IP 地址就是要转发到的目标地址,也是就终于找到 IP 包头里的目标地址了,说明已抵达终点。 知道对方的 IP 地址之后,接下来需要通过 ARP 协议根据 IP 地址查询 MAC 地址,并将查询的结果作为接收方 MAC 地址。
路由器也有 ARP 缓存,因此首先会在 ARP 缓存中查询,如果找不到则发送 ARP 查询请求。
接下来是发送方 MAC 地址字段,这里填写输出端口的 MAC 地址。还有一个以太类型字段,填写 0800 (十六进制)表示 IP 协议。
网络包完成后,接下来会将其转换成电信号并通过端口发送出去。这一步的工作过程和计算机也是相同的。
发送出去的网络包会通过交换机到达下一个路由器。由于接收方 MAC 地址就是下一个路由器的地址,所以交换机会根据这一地址将包传输到下一个路由器。
接下来,下一个路由器会将包转发给再下一个路由器,经过层层转发之后,网络包就到达了最终的目的地。
不知你发现了没有,在网络包传输的过程中,源 IP 和目标 IP 始终是不会变的,一直变化的是 MAC 地址,因为需要 MAC 地址在以太网内进行两个设备之间的包传输。