1. TCP 网络分层
什么是 TCP 网络分层?
TCP 网络分层是指将计算机网络的通信过程分为不同的层次,每一层都承担特定的功能。通常,网络分为四个主要层次:应用层、传输层、网络层和链路层。这种分层结构使得网络协议的设计和实现更加清晰,便于维护和扩展。
生活案例帮助记忆
网络可以被比作一个快递系统。TCP 网络分层把这个系统分成不同的部分,每一部分负责不同的任务。这些层级就像快递的不同环节:
- 应用层:类似快递员和客户之间的对话,负责处理用户的需求(例如发送邮件、浏览网页)。
- 传输层:确保快递包裹安全、完整地送到(例如 TCP 和 UDP)。
- 网络层:负责找到最短的送货路线(例如 IP)。
- 链路层:处理快递车和道路的连接(例如 Ethernet)。
2. TCP 的三次握手
为什么是三次握手? 为什么不是两次、四次?
TCP 的三次握手是建立可靠连接的过程,确保通信双方都能正常发送和接收数据。握手过程为:
- 第一次:发送方发送一个请求(SYN)。
- 第二次:接收方确认请求(SYN-ACK)。
- 第三次:发送方再次确认(ACK)。
这一过程确保了双方都明确连接的状态。
生活案例帮助记忆
三次握手的过程如下:
- 第一次握手:A 发送一个请求,表示:“我想和你建立连接。”(A 发送 SYN)
- 第二次握手:B 收到后回复:“我也想和你建立连接!”(B 发送 SYN-ACK),并确认收到了 A 的请求。
- 第三次握手:A 收到 B 的回复后,再次确认:“太好了,我确认我们要建立连接!”(A 发送 ACK)。
为什么是三次?
如果只有两次握手,A 发送请求后,B 可能并不知道 A 的请求是否成功。即使 B 回复了,A 也可能没有收到这个回复,这会导致连接不稳定,A 可能认为自己已经连接,但实际上并没有。
为什么不是四次?
如果是四次握手,双方确认的过程会变得冗长,增加了建立连接的延迟。而三次握手刚好可以确保双方都确认了连接意图,既高效又安全。
因此,三次握手的设计确保了双方都明确了连接的状态,避免了误解和潜在的连接问题。
3. TCP 的四次挥手
为什么是四次? 为什么不能是三次?
TCP 的四次挥手是终止连接的过程,确保双方都能安全地结束通信。过程如下:
- 第一次:发送方发送结束请求(FIN)。
- 第二次:接收方确认收到(ACK)。
- 第三次:接收方发送结束请求(FIN)。
- 第四次:发送方确认(ACK)。
这一过程确保双方都明确结束连接的意图。
生活案例帮助记忆
四次挥手就像两个人结束见面,步骤如下:
- 第一次:A 说:“我想结束这次见面。”(A 发送 FIN)
- 第二次:B 说:“好的,我收到了。”(B 发送 ACK)
- 第三次:B 说:“我也准备结束了。”(B 发送 FIN)
- 第四次:A 说:“我确认结束。”(A 发送 ACK)
为什么四次?
如果只有三次,A 可能在 B 还没准备好时就结束了,可能会造成误会。
4. 为什么 SYN/FIN 不包含数据却要消耗一个序列号?
在 TCP 中,SYN 和 FIN 标志虽然不包含数据,但仍然需要消耗一个序列号。这是为了确保数据包的顺序和完整性。每一个序列号都代表一个特定的状态,帮助双方正确理解连接的建立和结束。
生活案例帮助记忆
SYN 和 FIN 就像是约定见面和结束见面的信件,虽然没有实际的内容,但它们仍然需要一个编号来确保顺序和完整性,就像快递包裹需要追踪号码。
5. 什么是半连接队列? 什么是 SYN Flood 攻击?
半连接队列是指服务器在收到 SYN 请求后,暂时保存这些请求以等待确认的状态。这种机制帮助管理连接请求,确保服务器能够有效处理。
生活案例帮助记忆
- 半连接队列:当发出约见请求后,等待对方确认的状态。服务器会把这些请求放在一个“等待列表”中。
- SYN Flood 攻击:攻击者发送大量的 SYN 请求,但不去完成连接,导致服务器的等待列表被占满,真正的请求无法处理。就像有人不停地发出约见请求,却不打算见面,导致真正想见面的人无法得到回应。
6. TCP 快速打开 (TFO) 的原理
TCP 快速打开(TFO)是一种优化连接建立过程的技术,允许客户端在第一次握手时就发送数据,减少延迟。其基本步骤包括:
- 第一次握手:客户端发送带数据的 SYN 请求,表示想要建立连接并发送数据。
- 第二次握手:服务器确认后存储数据,回复 SYN-ACK。
- 第三次握手:客户端发送 ACK,确认连接建立。
生活案例帮助记忆
TCP 快速打开就像在约见的时候,提前告诉对方要讨论的内容,这样可以节省时间。客户端在第一次请求时,带上想说的内容,避免了等待。
7. TCP 报文中的时间戳有什么作用?
TCP 报文中的时间戳用于记录数据包的发送时间,有助于计算往返时间(RTT),确保数据包在网络中能被有效追踪。时间戳机制能够帮助 TCP 实现更加精确的流量控制和拥塞控制。
生活案例帮助记忆
时间戳就像快递包裹上的邮戳,用于记录包裹的发送时间,帮助计算送达时间,确保包裹不会丢失。
8. TCP 的超时重传时间是如何计算的?
超时重传时间(RTO)是 TCP 用于确定在数据包丢失时,应该等待多长时间才重新发送数据的时间。RTO 的计算基于往返时间(RTT)和其变化情况。
生活案例帮助记忆
想象自己是一名快递员,负责将包裹送到客户手中。在这个过程中,快递员需要记录每次送达所需的时间,以便更好地安排后续的送货。
- 记录送达时间:快递员都会记录从快递中心出发到客户那里所花费的时间。
- 计算平均送达时间:快递员会计算这些送达时间的平均值,以合理预测下次送快递的时间。
- 考虑送达时间的变化:快递员要考虑交通、天气等因素的影响,记录送达时间的变化幅度。
- 计算重发的时间:基于记录的平均送达时间和波动,快递员可以决定在多长时间后,如果没有收到客户的确认,就要重新发送快递。
- 重新发送快递:如果在设定的时间内没有收到客户的确认,快递员会重新发送快递。
9. TCP 的流量控制
流量控制是 TCP 用于管理发送方和接收方之间数据流的一种机制,确保接收方不会因为处理不过来而导致数据丢失。接收方会通过窗口大小告知发送方可以接收的数据量。
生活案例帮助记忆
流量控制就像快递公司控制每天的送件量,确保不会超出送货能力。接收方会告诉发送方今天能接收多少包裹,以避免过载。
10. TCP 的 Keep-Alive 原理
TCP 的 Keep-Alive 是一种机制,用于定期发送探测信号,以确保连接的持续有效性。当一段时间内没有数据传输时,Keep-Alive 会发送一个小的数据包。如果在设定的时间内没有收到对方的回应,连接将被视为断开。
生活案例帮助记忆
可以将 Keep-Alive 比作定期打电话确认朋友的状态。例如,和朋友很久没有联系,为了保持关系,每隔一段时间打一次电话。
11. TCP 中的端口号
端口号是用来标识计算机上不同应用程序的数字标识符。每个应用程序都有自己的端口号,网络通过端口号将数据包正确路由到相应的应用程序。例如,HTTP 协议使用 80 号端口,HTTPS 使用 443 号端口。
生活案例帮助记忆
可以将端口号比作快递的地址。想象一下,快递员需要把包裹送到不同的房间。每个房间都有自己的“房间号码”,这样快递员才能把包裹准确送到。
12. 端口号与网络分层
理论知识:端口号属于传输层,它帮助不同的应用程序在同一台计算机上相互区分。通过端口号,计算机能够识别和处理来自不同应用程序的数据流。
生活案例帮助记忆
可以将端口号比作快递员在不同房间之间传递包裹。想象一下,一个大楼里有多个房间,每个房间都有不同的应用程序在运行。快递员通过查看房间号码,确保每个包裹都能准确送到对应的应用程序。
13. 确认号计算
A 和 B 两个主机之间建立了一个 TCP 连接,A 主机发给 B 主机两个 TCP 报文,大小分别是 500 和 300,第一个报文的序列号是 200,那么 B 主机接收两个报文后,返回的确认号是多少?
确认号是 TCP 用于跟踪已成功接收数据的序列号。当发送方发送数据包后,接收方会返回一个确认号,表示下一个期望接收的数据序列号。
生活案例帮助记忆
假设 A 发送两个包裹,第一个包裹是 500 个单位,第二个包裹是 300 个单位。确认号的计算就像记录总共发了多少单位:
- 初始状态:假设最开始,A 发送的第一个字节序列号是 200。
- 第一个包裹:A 发送第一个包裹,包含 500 个单位(字节)。因此,确认号的计算如下:发送的字节序列号范围是 200 到 699(共 500 个单位)。B 收到这个包裹后,确认号应该是下一个期望接收的字节序列号,即 700(也就是 200 + 500)。
- 第二个包裹:接着,A 发送第二个包裹,包含 300 个单位。这时,确认号的计算如下:发送的字节序列号范围是 700 到 999(共 300 个单位)。B 收到这个包裹后,确认号应该是下一个期望接收的字节序列号,即 1000(也就是 700 + 300)。
确认号 1000 并不是已发送的单位总和,而是 B 期望接收的下一个字节序列号。
14. 收到 IP 数据包解析后如何投递到上层协议
收到 IP 数据包解析以后,如何知道这个分组应该投递到上层的哪一个协议(UDP 或 TCP)?在网络通信中,当一个 IP 数据包被接收时,网络层(通常是 IP 层)会解析这个数据包的头部信息。数据包头部中有一个重要的字段,称为“协议字段”(Protocol Field),它指定了数据包应该被传递到的上层协议(例如 TCP 或 UDP)。根据这个字段,网络层能够将数据包正确地路由到对应的传输层协议,确保数据能够顺利到达目标应用程序。
具体步骤如下:
- 接收数据包:网络接口接收到 IP 数据包。
- 解析数据包头:网络层解析数据包的头部信息,查看协议字段。
- 判断协议类型:根据协议字段的值(如 6 表示 TCP,17 表示 UDP),网络层决定将数据包传递给哪个上层协议处理。
- 投递数据包:网络层将数据包传递给相应的传输层协议(TCP 或 UDP)。
生活案例帮助记忆
可以将这一过程比作快递员处理包裹的过程。想象一下,快递员收到一个包裹,包裹上贴有快递单,快递单上有明确的备注信息:
- 接收包裹:快递员接收到包裹。
- 查看快递单:快递员查看快递单上的备注。
- 判断送达地点:快递单上可能写着“送到 A 公司(使用快递服务 A)”或“送到 B 公司(使用快递服务 B)”。这就相当于数据包中的协议字段,指明了包裹需要送达的具体服务。
- 投递包裹:快递员根据快递单的备注,将包裹送到 A 公司或 B 公司,从而确保包裹能够准确送达。
快递员的角色相当于网络层,而快递单上的备注信息则相当于 IP 数据包头部的协议字段。通过查看这些信息,快递员(网络层)能够知道包裹(数据包)应该被送到哪个地方(上层协议),从而避免错误投递。
15. 应用程序如何提供记录标识
TCP 提供了一种字节流服务,而收发双方都不保持记录的边界,应用程序应该如何提供他们自己的记录标识呢?
由于 TCP 是连续的字节流,应用程序需要在发送的内容中添加标识符,以帮助接收方准确找到内容的边界。应用程序使用自己约定的规则来表示消息的边界,比如有一些使用回车+换行("\r\n"),比如 Redis 的通信协议(RESP protocol)。
生活案例帮助记忆
可以将应用程序的标识比作一本没有段落的书。章节标题帮助读者找到内容的边界,使得信息传递更加清晰。
16. Telnet 的用法
Telnet 是一种网络协议,允许通过命令行界面远程连接到另一台计算机。它通常用于远程管理服务器、网络设备或测试网络服务。用户可以使用 Telnet 发送简单的命令以检查特定端口是否开放、发送 HTTP 请求、或者进行远程登录。
Telnet 的基本用法
- 打开命令行界面:在计算机上打开命令行工具(如 Windows 的命令提示符或 Linux 的终端)。
- 使用 Telnet 命令:连接到主机,使用以下命令格式:
例如:telnet [hostname] [port]
telnet example.com 80
- 测试连接:如果连接成功,将看到一个空白屏幕或提示符。如果连接失败,会收到错误消息。
- 发送请求:在连接成功后,可以手动输入 HTTP 请求,例如:
GET / HTTP/1.1 Host: example.com
生活案例帮助记忆
使用 Telnet 可以比作打电话确认某个号码是否能接通:
- 拨打电话:想确认某个朋友的电话号码是否有效,拿起电话,拨打这个号码。
- 等待接通:如果电话接通,听到铃声或朋友接听,这就相当于 Telnet 成功连接到主机的 80 号端口。
- 交谈:一旦接通,可以开始与朋友交谈(在 Telnet 中,可以输入 HTTP 请求),获取他们的反馈(服务器的响应)。
Telnet 的应用场景
- 远程管理:通过 Telnet,系统管理员可以远程登录到服务器,执行命令管理系统。
- 服务测试:网络工程师可以使用 Telnet 测试某个端口是否开放,例如:
telnet example.com 21
telnet example.com 25
- HTTP 请求测试:用户可以通过 Telnet 测试 HTTP 服务,发送请求并查看响应,以调试网页服务。
注意事项
- 安全性:Telnet 不加密数据传输,因此不建议在不安全的网络中使用。对于安全性要求较高的场合,建议使用 SSH(安全外壳协议)。
- 启用 Telnet:在某些操作系统中,Telnet 可能需要手动启用。例如,在 Windows 中,可能需要在“控制面板”中启用 Telnet 客户端。
17. Netstat 的用法
Netstat(网络统计)是一个命令行工具,用于显示网络连接、路由表、接口统计信息等。它可以帮助用户监控和诊断计算机的网络活动,了解当前的网络连接状态、使用的端口以及传输的数据量。
Netstat 的基本用法
- 打开命令行界面:计算机上打开命令提示符(Windows)或终端(Linux/Mac)。
- 输入 Netstat 命令:常用的 Netstat 命令格式如下:
- 查看所有连接:
netstat -a
- 查看特定协议的连接:
其中 -t 表示只显示 TCP 连接,-u 显示 UDP 连接。netstat -t (Linux) 或 netstat -n (Windows)
- 显示进程标识符(PID):
netstat -ano (Windows) 或 netstat -p (Linux)
- 周期性刷新显示:
netstat -c (Linux)
- 查看所有连接:
生活案例帮助记忆
将 Netstat 比作快递员查看所有正在运送的包裹:
- 快递员的工作:想象一个快递员负责运输多个包裹,他需要知道每个包裹的状态和去向。
- 使用工具查看状态:快递员使用一个工具(类似于 Netstat)来查看所有包裹的信息,包括每个包裹的目的地、当前状态(如在运送中、已送达等)。
- 了解运输情况:通过这个工具,快递员可以知道哪些包裹正在运送,哪些包裹已经送达,哪些包裹还在等待发送。这有助于快递员确保所有包裹按时送达。
Netstat 的应用场景
- 监控网络连接:用户可以使用 Netstat 查看当前的网络连接,判断是否有异常连接(如未授权的访问)。
- 故障排查:当网络出现问题时,Netstat 可以帮助用户诊断问题,确定是哪个程序占用了网络资源或者哪个端口出现了问题。
- 安全审计:系统管理员可以使用 Netstat 检查系统的网络活动,确保没有可疑的连接或未授权的服务在运行。
注意事项
- 权限问题:在某些操作系统上,查看某些连接可能需要管理员权限。
- 输出信息:Netstat 的输出信息可能会比较多,用户需要仔细分析,找到自己关心的连接和状态。
18. Tcpdump 的用法
Tcpdump 是一个强大的命令行网络抓包工具,用于捕获通过网络接口的数据包,并允许用户分析这些数据包的内容。它广泛用于网络故障排查、安全分析和性能监测。
Tcpdump 的基本用法
- 打开命令行界面:计算机上打开终端(Linux/Mac)或命令提示符(Windows 下需要安装相应工具)。
- 基本命令格式:
- 捕获数据包:
其中 [interface] 是你的网络接口名称,例如 eth0 或 wlan0。tcpdump -i [interface]
- 保存到文件:
tcpdump -i [interface] -w [filename].pcap
- 读取文件:
tcpdump -r [filename].pcap
- 过滤特定流量:
tcpdump -i [interface] port 80
- 捕获数据包:
生活案例帮助记忆
将 Tcpdump 比作快递员记录来往的“快递包裹”:
- 快递员的工作:想象一个快递员负责接收和发送快递包裹,他需要记录每一个包裹的详细信息,包括寄件人、收件人、内容和状态。
- 记录包裹信息:快递员使用一个记录工具(类似于 Tcpdump)来捕捉每个包裹的信息。当一个包裹到达时,他会记录下这个包裹的所有细节,比如它来自哪里,送往哪里,以及包裹的状态(如是否已签收)。
- 分析包裹内容:通过这些记录,快递员可以分析哪些包裹经常延误,哪些包裹丢失,从而优化快递服务,确保信息的准确传递。
Tcpdump 的应用场景
- 网络故障排查:当网络出现问题时,Tcpdump 可以帮助用户捕获和分析数据包,找出问题的根源。
- 安全监控:安全专家可以使用 Tcpdump 监控网络流量,检测可疑活动和潜在的安全威胁。
- 性能分析:通过分析捕获的数据包,用户可以了解网络的性能,识别瓶颈和优化网络流量。
注意事项
- 权限问题:在大多数操作系统中,捕获数据包需要管理员权限,因此可能需要使用 sudo 来运行 Tcpdump。
- 数据量:Tcpdump 捕获的数据包可能会非常庞大,用户需要合理设置过滤条件,以避免捕获过多不必要的数据。
19. Wireshark 的用法
Wireshark 是一种图形化网络协议分析工具,可以实时捕获网络数据包并进行详细分析。用户可以通过 Wireshark 观察网络流量的详细信息。
生活案例帮助记忆
可以将 Wireshark 比作观看电影。用户通过这个工具可以像看电影一样查看网络流量,理解每个数据包的详细信息,帮助分析和解决网络问题。
20. TCP 和 UDP 的区别
TCP 和 UDP 的基本概念
-
TCP(传输控制协议):
- 提供可靠的、面向连接的数据传输。
- 确保数据包按顺序送达,不会丢失。
- 适用于对数据完整性和顺序要求较高的应用。
-
UDP(用户数据报协议):
- 提供不可靠的、无连接的数据传输。
- 数据包可能会丢失,顺序也可能错乱。
- 适用于对速度要求高,但不太在乎数据完整性的应用。
生活案例帮助记忆
-
TCP 比作可靠的快递公司:
- 选择了一家非常可靠的快递公司来寄送重要的文件。这个快递公司会:
- 确保每个包裹都能按时送达。
- 提供实时的快递跟踪,让人知道包裹的运输状态。
- 如果某个包裹在运输过程中丢失,它会重新寄送,确保最终收到文件。
- 这样的快递公司就像 TCP 协议,确保每个数据包都可靠送达,适合需要保证数据完整性和顺序的场景,比如文件传输和网页加载。
- 选择了一家非常可靠的快递公司来寄送重要的文件。这个快递公司会:
-
UDP 比作不太可靠的快递公司:
- 选择了一家快递公司,它的服务较为便宜,但并不可靠。这个快递公司可能会:
- 有时丢失包裹,导致无法收到某些物品。
- 不会提供跟踪服务,无法知道包裹的具体位置。
- 可能会错乱顺序,比如先收到某个包裹,后收到另一个包裹。
- 这样的快递公司就像 UDP 协议,虽然数据包可能会丢失或顺序错乱,但它传输速度快,适合对速度要求高的场景,比如视频会议和在线游戏。
- 选择了一家快递公司,它的服务较为便宜,但并不可靠。这个快递公司可能会:
21. 如果要设计一个 QQ,在网络协议上如何设计?
设计思路
- 登录过程:客户端使用 TCP 协议向服务器发送信息,HTTP 协议下载信息。登录之后,会有一个 TCP 连接来保持在线状态。
- 和好友发消息:客户端使用 UDP 协议,但需要通过服务器转发。为了确保传输消息的可靠性,采用上层协议来保证可靠传输。如果消息发送失败,客户端会提示消息发送失败,并可重新发送。
- 文件传输:如果是在内网里的两个客户端传文件,QQ采用的是 P2P 技术,不需要服务器中转。