计算机网络基础知识
date
Dec 31, 2022
slug
computer-networking-knowledge
status
Published
tags
Network
Question
Interview
summary
计算机网络自顶向下方法
type
Post
Created Time
Oct 28, 2023 01:45 PM
Updated Time
Oct 28, 2023 01:45 PM
AI summary
TCP和UDP在应用场景上的区别,TCP的保活计时器和四次挥手的等待时间,从浏览器输入URL到显示主页的过程,HTTP请求的传输过程,HTTP1.0、HTTP1.1和HTTP2.0的区别,HTTPS的定义和加密流程,TCP的粘包和解决方法,TCP的流量控制和拥塞控制的区别,拔掉网线后TCP连接的状态,TCP的keepalive和HTTP的keep-alive的区别,TCP建立连接时序列号的作用,TCP握手丢失的处理过程等计算机网络基础知识。
Status
什么是 TCP 网络分层?
因特网的协议栈由 5 个层次组成:
- 应用层:主要作用是为应用程序提供数据交换的服务。应用层定义了应用程序之间的通信规则和数据格式,使得不同应用程序能够能够互相通信和交换数据。因特网的应用层包含许多协议,例如 HTTP(Web 文档的请求和传输)、SMTP(电子邮件报文的传输)、FTP(两个终端系统之间的文件传输)等。应用层协议还可以提供其他的服务,如身份验证、加密和数据压缩等。
- 运输层:主要作用是在应用程序端点之间传输应用层报文,定义了传输数据的协议和端口号,主要用于数据的分段、传输和重组。在这一层工作的协议有TCP 和UDP 等。
- TCP 是面向连接的服务,它能够能够将长报文划分为短报文,并提供拥塞控制机制,控制传输速率,TCP 的传输效率低,可靠性强,用于传输对可靠性要求高、数据量大的数据,比如支付宝转账使用的就是 TCP。
- UDP 是无连接的服务,没有提供任何不必要的服务,它传输速度相对于 TCP 较快,但不保证数据可靠性和完整,用于传输可靠性要求不高的数据,例如抖音等视频服务就使用了UDP 。
- 网络层:主要作用是通过路由选择对数据包中的 IP 地址进行封装和解析,将数据包从一台主机,传输到另一台主机,著名的 IP 协议就在这一层,因此也称为 IP 层。网络层会将数据包分成多个数据报,每个数据报包含了目标主机的 IP 地址和其他控制信息,然后,网络层根据数据报的目标地址和当前的网络状态,选择最佳的路由路径,将数据报发送到下一个路由器或目标地址。网络层还负责 IP 地址的分配和转换,以及数据包的分段和重组。在这一层工作的设备有路由器、交换机、防火墙等。
- 链路层:主要作用实现不同设备之间的通信,如将网络层传输下来的数据报封装成帧的形式,然后在物理层进行传输。链路层还提供了以下功能:帧的封装和解封装、物理地址(MAC)的寻址、数据帧的错误检查和纠正(如循环冗余检查 CRC)、流量控制和拥塞控制、数据可靠性保证(丢帧重传)。这一层的数据叫作数据帧。在这一层工作的设备是网卡、网桥、交换机。
- 物理层:主要作用是定义物理设备标准,将数字信号转换为物理信号,即传输比特流,并将物理信号传输到接收方,再将物理信号重新转换为数字信号。除了数据的编码和解码,物理层还提供了时钟同步、奇偶校验、信号放大和衰减等功能,以确保数据的正确性和可靠性。
需要注意的是,运输层的 TCP 服务和链路层都有拥塞控制和数据可靠性保证的功能,但它们是相互独立的、分别作用于不同层次的网络,链路层主要针对局域网等较小范围的网络,运输层则针对因特网等较大范围的网络。
因特网协议栈的 5 层协议和开发系统互连(OSI)模型有什么区别?
开放系统互连(OSI)参考模型的 7 层分别是:应用层、表示层、会话层、运输层、网络层、数据链路层和物理层。OSI 中附加的两个层,即表示层和会话层的作用分别是:
- 表示层:主要对接收的数据进行解释、加密、解密、压缩、解压缩等,即把计算机能够识别的内容转换成人能够识别的内容(图片、声音、文字等)。
- 会话层:在传输层的基础上建立连接和管理会话,具体包括登录验证、断点续传、数据粘包与分包等。在设备之间需要互相识别的可以是 IP , 也可以是 MAC 或者主机名。
可以看到,这两个层次提供的服务,在互联网中,也有相应的替代和实现,这取决于应用开发者如何构建。
TCP 网络分层的好处是什么?
- 模块化:每个层次的功能都有明确的定义,层次之间互相解耦,使得协议的设计、实现、维护和标准化都更加容易。
- 可靠性:每个层次都有各自的功能和职责,协议的设计者能够更好的掌握每个层次的功能和目标,进行独立的测试,当某一层有了更好的实现,也可以方便的进行替换。
- 可拓展性:可以方便的删除、增加和替换某一个层次,如 IPV4 升级到 IPV6,就可以通过新增一个网络层地址来方便的实现。
- 易于教学:分层的设计使得协议的教学变得更加容易,因为每个层都有特定的,要提供的服务和功能,教学者可以逐层进行讲解,学习者也可以逐层进行学习和使用。
为什么 SYN/FIN 不包含数据却要消耗一个序列号?
在 TCP 协议中,SYN 和 FIN 是控制报文段,用于在连接的建立和关闭过程中进行通信的控制。这些控制报文段不包含数据,但是它们仍然需要消耗一个序列号,原因如下:
- 序列号是用来保证数据的可靠传输的。在 TCP 协议中,每个字节都被编号,发送方会在报文段的首部中包含一个序列号,用来表示这个报文段中第一个字节的编号。接收方会在确认报文段中包含一个确认序号,表示这个序号之前的所有字节都已经被正确地接收了。因此,在建立连接时和关闭连接时,SYN 和 FIN 报文段也需要包含一个序列号,以便接收方能够正确地确认收到这个报文段。
- 序列号的作用还包括防止重复数据的发送和接收。TCP 协议中,每个序列号只能使用一次,因此发送方需要记录已经发送的最后一个序列号,以便在重传数据时避免重复发送。接收方需要记录已经接收的最后一个序列号,以便在接收到重复数据时能够准确地识别。
- 序列号还可以用来防止网络攻击。例如,攻击者可能会伪造一个 TCP 报文段,发送给服务器,以试图建立一个不存在的连接。如果服务器接收到一个 SYN 报文段,但是没有对应的序列号,那么它会认为这个报文段是非法的,并且会丢弃这个报文段。因此,序列号在 TCP 协议中也起到了一定的安全性保护的作用。
因此,SYN 和 FIN 报文段虽然不包含数据,但是它们仍然需要消耗一个序列号,以确保 TCP 连接的可靠性和安全性。
TCP 的三次握手为什么是三次?为什么不是两次或者四次?
TCP 是提供面向连接的通讯传输,在进行数据传输之前,要做好两端之间的准备,采用三次握手的机制是为了确保双方之间建立可靠的连接,避免因网络传输中的数据包丢失或延迟而导致连接建立失败或不可靠。
三次握手的过程如下:
- 第 1 次握手建立连接时,客户端向服务器发送 SYN 报文(SEQ=x,SYN=1),并进入 SYN_SENT 状态,等待服务器确认。
- 第 2 次握手实际上是分两部分来完成的,即 SYN+ACK(请求和确认)报文。
- 服务器收到了客户端的请求,向客户端回复一个确认信息(ACK=x+1)。
- 服务器再向客户端发送一个 SYN 包(SEQ=y)建立连接的请求,此时服务器进入 SYN_RECV 状态,如图所示。
- 第 3 次握手,是客户端收到服务器的回复(SYN+ACK 报文)。此时,客户端也要向服务器发送确认包(ACK)。此包发送完毕客户端和服务器进入 ESTABLISHED 状态,完成 3 次握手。
这个三次握手的过程是必要的,因为它可以保证双方都能够正确地识别对方,并且能够收发数据。具体来说,三次握手可以解决以下问题:
- 可以防止已失效的连接请求报文段(即已经过期的 SYN 报文)被重新发送到服务器,从而避免了服务器误认为客户端仍然需要建立连接。
- 可以防止已失效的连接请求报文段发送到客户端,从而避免了客户端误认为服务器已经接受了连接请求。
- 可以防止网络中延迟的 ACK 报文突然出现,从而导致双方都认为连接已经建立,实际上并没有。
为什么不是两次握手呢?如果只进行两次握手,那么会存在以下问题:
- 客户端向服务器发送了一个 SYN 报文,并等待服务器的响应。如果这个 SYN 报文丢失了,那么客户端会一直等待,服务器也不知道客户端是否还想建立连接。这个问题可以通过设置超时时间来解决,但是如果超时时间设置得太短,那么会导致连接建立不稳定。
- 如果客户端发送了 SYN 报文,并且服务器收到了这个报文,那么服务器会给客户端返回一个 SYN+ACK 报文。但是如果这个 SYN+ACK 报文丢失了,那么客户端会一直等待,服务器也不知道客户端是否还想建立连接。这个问题可以通过设置超时时间来解决,但是同样会导致连接建立不稳定。
因此,为了解决上述问题,TCP 使用了三次握手来建立连接。三次握手可以确保客户端和服务器都能够正确地识别对方,并且能够收发数据。如果使用四次握手,势必会增加一定的开销,并且不会带来额外的好处。
TCP 的四次挥手为什么是四次?为什么不能是三次?
TCP 的四次挥手是用于关闭一个 TCP 连接的过程,它的过程如下:
- 客户端向服务器发送一个 FIN 报文,表示客户端不再发送数据,但是仍然可以接收数据。
- 服务器收到 FIN 报文后,会回复一个 ACK 报文,表示已经收到客户端的关闭请求。
- 服务器在发送完所有剩余的数据后,会向客户端发送一个 FIN 报文,表示服务器也准备关闭连接了。
- 客户端收到 FIN 报文后,会回复一个 ACK 报文,表示已经收到服务器的关闭请求。在这个 ACK 报文中,客户端会把服务器发来的序列号加一,作为下一次发送数据的序列号。
这个过程中有两个 ACK 报文,因为 TCP 是一个双向通信协议。在第一次挥手后,服务器可能还有数据要发送给客户端。因此,服务器需要发送 ACK 报文来确认客户端的 FIN 报文已经收到,并且告诉客户端它还有数据要发送。在第二次挥手后,客户端也可能还有数据要发送给服务器,因此客户端需要发送 ACK 报文来确认服务器的 FIN 报文已经收到,并且告诉服务器它还有数据要发送。
如果四次挥手被简化为三次挥手,比如将第二次挥手和第三次挥手合并为一个过程,那么在收到客户端的 FIN 报文后,服务器需要处理大量的任务,并且可能需要等待一段时间,以确保客户端已经成功接收了所有数据。如果处理的任务较多,客户端可能会因为等待时间过长而重发 FIN 报文,从而导致资源的浪费和连接效率的降低。因此,为了避免客户端等待时间过长,TCP 四次挥手中的第二次挥手和第三次挥手必须分开进行,以确保数据的完整性和可靠性,并且避免客户端等待时间过长。
什么是半连接队列?
半连接队列(Half-open queue)是指在 TCP/IP 协议中,当一个客户端向服务器发起连接请求时,服务器会将其加入一个队列中,以便在完成 TCP 三次握手后建立连接。在这个队列中,我们可以分为两类连接:已完成三次握手的连接和未完成三次握手的连接。而半连接队列则是存储未完成三次握手的连接的队列。
什么是 SYN Flood 攻击?
在 TCP 协议中,建立一个 TCP 连接需要进行三次握手,即客户端发送 SYN 包,服务器回复 SYN-ACK包,客户端再回复 ACK 包,这样才能建立连接。然而,SYN Flood 攻击利用了这个过程中的漏洞,攻击者发送大量的伪造的 SYN 包到服务器,服务器将为每个伪造的 SYN 包建立一个半连接队列,并等待ACK 包。但是攻击者不回复 ACK 包,这样服务器将会一直等待,直到超时。攻击者不断发送 SYN 包,导致服务器的半连接队列被填满,无法处理正常的连接请求,从而使得合法的请求无法得到响应或者服务器崩溃。
如何防范 SYN Flood 攻击?
- 使用防火墙:防火墙可以过滤掉一些伪造的 SYN 包和其他恶意流量,从而减轻服务器的负担。例如,可以设置基于IP地址或端口号的访问限制,禁止某些IP地址或端口号的访问。
- 使用流量清洗设备:流量清洗设备能够通过检测和清洗网络流量,从而保护网络免受 SYN Flood 攻击的影响。使用流量清洗设备的主要步骤如下:
- 监控网络流量:流量清洗设备需要监控网络流量,以便及时发现并防范攻击。监控可以使用网络流量镜像、端口镜像、IP 镜像等方式实现。
- 分析流量:流量清洗设备需要对进入网络的流量进行深度分析,以便区分正常流量和攻击流量。分析可以采用基于行为分析、流量模式分析、协议分析等多种技术。
- 过滤攻击流量:一旦发现攻击流量,流量清洗设备需要立即进行过滤和阻断,以保护网络不受攻击的影响。过滤可以采用黑白名单策略、基于规则的过滤、基于信誉的过滤等多种技术。
- 提供报告和日志:流量清洗设备需要记录所有的攻击事件,并提供报告和日志,以便安全人员分析攻击行为和制定防御策略。
需要注意的是,流量清洗设备本身也可能成为攻击目标,因此需要采取一些安全措施,例如使用多台设备进行负载均衡、定期更新设备的软件和规则等。
- 使用负载均衡器:负载均衡器可以将流量分散到多台服务器上,从而分摊服务器的负载。如果一台服务器受到 SYN Flood 攻击,负载均衡器可以将流量转发到其他正常的服务器上,从而保证整个系统的正常运行。
- 使用 SYN Cookies:SYN Cookie 技术是一种防范 SYN Flood 攻击的技术,它通过对服务器接收到的 SYN 报文段进行处理,从而能够防止攻击者发送大量虚假的 SYN 报文段。过程如下:
- 服务器接收到 SYN 报文段:当服务器接收到客户端发送的 SYN 报文段时,服务器会根据报文段的源 IP 地址、源端口号和目标端口号等信息生成一个 Cookie 值,并将该 Cookie 值放入 TCP 报文段的序列号字段中发送给客户端。
- 客户端发送 ACK 报文段:客户端接收到服务器发送的 TCP 报文段后,会将接收到的 Cookie 值放入 ACK 报文段的序列号字段中,并将 ACK 报文段发送给服务器。
- 服务器验证 Cookie 值:服务器在接收到客户端发送的 ACK 报文段后,会从 ACK 报文段中获取 Cookie 值,并将该 Cookie 值与之前生成的 Cookie 值进行比较,如果两个 Cookie 值相同,则说明该连接请求是合法的,服务器会创建一个新的 TCP 连接,并向客户端发送 SYN+ACK 报文段,以建立连接。
- 重新生成 Cookie 值:如果服务器没有收到客户端发送的 ACK 报文段,或者从 ACK 报文段中获取的 Cookie 值与之前生成的 Cookie 值不匹配,则说明该连接请求是非法的,服务器会丢弃该连接请求,并重新生成一个新的 Cookie 值,以继续等待下一个连接请求。
使用 SYN Cookie 技术的原理是,服务器在收到 SYN 报文段时,不再将该连接请求放入半连接队列中等待客户端的 ACK 报文段,而是将生成的 Cookie 值发送给客户端,并将该连接请求的信息保存在 Cookie 值中(这个 Cookie 通常是一个 32 位或 64 位的整数,可以保存在服务器的内存中,也可以作为 TCP 头部的一个字段进行传递)。这样一来,服务器就可以在接收到客户端发送的 ACK 报文段时,通过比较 ACK 报文段中的 Cookie 值和服务器保存的 Cookie 值,来判断该连接请求是否合法,并进行相应的处理。
TCP 中的 TFO 是什么?
TFO(TCP Fast Open)是一种 TCP 协议的扩展,旨在加速 TCP 连接的建立过程。在传统的 TCP 连接建立过程中,客户端和服务器需要进行三次握手,才能建立一个可靠的连接。TFO 的作用是在第一次握手时,就传输一些数据。这个数据可以是一些加密的密钥,也可以是一些请求数据等等。这样可以省去第二次握手的过程,从而加速连接的建立。
具体来说,当客户端和服务器之间的初始连接被建立时,客户端会在 SYN 包中携带一些数据,并将 TCP 选项中的 TFO 标识设置为 1。如果服务器也支持 TFO,那么它就会在收到 SYN 包时,直接使用这些数据来初始化连接,而不需要进行第二次握手。这样可以减少连接建立的时间和延迟,特别是对于那些需要频繁建立 TCP 连接的应用程序来说,效果尤为显著。
需要注意的是,TFO 并不是所有 TCP 连接都能使用的。它只能在一些特定的场景下使用,比如客户端和服务器之间的连接是可信的,并且双方都支持 TFO。此外,由于 TFO 在第一次握手时发送了一些数据,因此它可能会暴露一些敏感信息,被攻击者利用来进行服务攻击或者窃取数据,需要特别小心处理。
TFO 的优点和缺点是什么?
优点:
- 减少连接建立时间:由于 TFO 避免了第一次握手和第二次握手的延迟,因此可以减少连接建立的时间,提高网络性能。
- 减少网络延迟:TFO 可以避免传统 TCP 连接建立时的延迟,从而可以减少网络延迟,提高数据传输的效率。
- 改善用户体验:TFO 可以加速网页加载速度、减少视频卡顿等问题,提高用户体验。
- TFO 可以有效防止 SYN Flood 攻击,因为 Cookie 携带了验证的相关信息。
缺点:
- 安全性问题:TFO 需要在 SYN 包中携带数据,可能会被攻击者利用来进行拒绝服务攻击或者窃取数据,因此在使用 TFO 时需要谨慎考虑安全性问题。
- 兼容性问题:TFO 只适用于已经建立过连接的客户端和服务器之间的通信,因为在建立新连接时,无法确定对方是否支持 TFO 机制。因此,TFO 的兼容性存在一定的问题。
- 部署问题:为了支持 TFO 机制,需要在客户端和服务器上都进行相应的配置和部署,这可能会增加部署和维护的难度。
TCP 报文中的时间戳有什么用?
TCP 报文中的时间戳选项由四部分组成:
- Kind:类别;
- Length:长度;
- TS Value:发送方时间戳;
- TS Echo Reply:时间戳回显值;
主要解决了两大问题:
- 精确计算往返时间(Round-Trip Time,RTT):TCP 报文中的时间戳选项可以帮助发送方和接收方更准确地估算网络延迟和计算往返时间(RTT)。通过在 TCP 报文中交换时间戳信息,发送方可以计算出整个通信过程的往返时间,从而更准确地估算网络延迟。
- 解决序列号回绕问题:当 TCP 序列号(32bit)达到最大值时,再次从零开始计数就会导致序列号回绕问题。时间戳选项可以解决这个问题,因为它允许接收方检测序列号回绕,并通过时间戳值的变化来区分两个序列号相同但是报文不同的情况。
TCP 的超时重传时间是如何计算的?
TCP 的超时重传时间(Retransmission Timeout)是指在发送数据时,如果发送方没有收到对方的确认(ACK)消息,就会启动重传机制。TCP 会等待一定的时间(即超时时间)来接收 ACK 消息,如果在超时时间内没有收到ACK 消息,就会将数据包重传。
经典的平缓往返时间(SRTT)指的是最近一段时间内 TCP 数据包往返时间的平均值,可以使用以下公式进行计算:
SRTT = (1 - alpha) * SRTT + alpha * SampleRTT
其中,alpha 是一个平滑系数,取值范围为 0 到 1 之间,一般情况下取值为 0.125,SampleRTT 表示最近一个数据包的往返时间。
alpha 趋近于 0 时,对短暂时延变化不敏感,反之,alpha 趋近于 1 时,则非常敏感。
TCP 是如何进行流量控制的?
TCP 使用滑动窗口机制进行流量控制,该机制允许发送方和接收方协商每次传输的数据量。
TCP 流量控制的主要因素如下:
- 接收窗口(Receive Window):接收方通过 TCP 头中的窗口字段(Window field)告知发送方其当前的接收窗口大小。这表示接收方所能接收的字节数,而不会导致其缓冲区溢出。
- 发送窗口(Send Window):发送方根据接收窗口的大小和其自身的发送缓冲区来确定发送窗口的大小。发送窗口决定了发送方在接收到接收方的确认(ACK)之前可以发送的最大字节数。
- 滑动窗口(Sliding Window):发送方和接收方都维护一个滑动窗口。发送方窗口的大小取决于接收方窗口和拥塞窗口的最小值。当发送方接收到来自接收方的 ACK 时,它会根据 ACK 中的窗口字段更新自己的发送窗口。
- 拥塞控制(Congestion Control):TCP 还会根据网络拥塞情况动态调整发送窗口的大小。拥塞控制算法(如慢开始、拥塞避免、快速重传和快速恢复)有助于防止网络拥塞,并在数据包丢失或延迟时调整传输速率。
keep-alive 是什么?
TCP keep-alive 是一种 TCP/IP 协议中的机制,用于检测在连接上的通讯是否仍在进行。当两个设备之间建立了一个 TCP 连接后,为了避免连接因为网络故障而断开,TCP keep-alive 机制会定期向另一端发送一些特殊的 keep-alive 数据包,另一端接收到该数据包后,必须响应一个 ACK 数据包,表示连接仍然存活。如果在一定时间内(称为 keep-alive 探测时间)内没有收到响应的 ACK 数据包,那么就认为连接已经断开了。
在实际应用开发中,TCP keep-alive 机制并不是非常频繁地使用,因为它会增加网络流量和服务器的负载。通常情况下,TCP keep-alive 机制只用于那些需要保持长时间空闲连接的应用,例如在文件传输或远程桌面连接中。对于其他类型的应用,例如普通的网页浏览,通常不需要使用 TCP keep-alive 机制,因为这些连接通常都是短时间的,而且会在完成请求后立即关闭。
TCP 端口号是什么?
TCP (Transmission Control Protocol) 的端口号是一个 16 位的数字,范围从 0 到 65535,用于标识在网络上运行的应用程序。
TCP 端口号被分为三类:0 到1023 为系统保留端口,用于常见的服务,例如 HTTP(80)、HTTPS(443)、FTP(21)、SSH(22)、Telnet(23)、SMTP(25)等;1024 到 49151 为登记端口,用于用户注册的服务,如 Redis(6379)、Tomcat(8080)、MongoDB(27017);49152 到 65535 为动态/私有端口,不分配给任何特定的服务,可以由应用程序动态分配。
在使用 TCP 端口时,需要注意以下几点:
- 端口号必须唯一:同一台计算机上的不同应用程序或服务应使用不同的端口号,以确保它们可以正确地识别和处理数据。
- 避免使用保留端口号:保留端口号通常是由系统进程或授权的应用程序使用的。因此,应避免在自己的应用程序中使用这些端口号,以免发生冲突。
- 防火墙设置:如果计算机上的防火墙开启了端口过滤功能,那么需要根据应用程序的需求,开放相应的端口号。
- 端口转发:在网络中,如果需要将数据从一个端口转发到另一个端口,需要确保目标端口是开放的,并且转发规则是正确的。
- 端口扫描:端口扫描是一种常见的网络攻击方式,攻击者通过扫描目标计算机上开放的端口,来寻找安全漏洞。因此,需要采取一些安全措施,如关闭不必要的端口,限制远程访问等,以减少被攻击的风险。
TCP 协议中,返回的确认号是如何计算的?
在 TCP 协议中,每个传输的数据包都有一个序列号(Sequence Number)和一个确认号(Acknowledgement Number)。序列号表示数据包中第一个字节在整个数据流中的位置,而确认号是用来确认接收端已经成功接收到数据的序列号。确认号的计算和处理如下:
- TCP 的确认号采用累计确认机制,即接收端发送给发送端的确认号表示已经成功接收到该确认号之前的所有数据。例如,如果接收端已经成功接收到的数据包序列号为 101、103、104、106,则确认号应该是 107,表示下一个期望接收的序列号是 107。
- 确认号的值等于已经成功接收到的数据包中最后一个字节的序列号加上 1,也就是下一个期望接收的数据包的序列号。例如,如果接收方已经成功接收了序列号为 101 的数据包,该数据包的大小为 100 字节,那么接收方期望接收的下一个序列号就是 201,因此确认号的值就是 201。
- 接收端会将确认号放在 ACK 标志位中,并将确认号发送给发送端,告诉发送端接收到了哪些数据。
- 发送端接收到确认号后,会将已经成功发送的数据包从发送缓冲区中删除,并根据确认号更新发送窗口的大小。确认号的接收也会触发发送端的重传机制,如果发送端在一定时间内没有收到对应的确认号,会重新发送数据包。
- TCP 还支持选择性确认(SACK)机制,当接收端收到乱序数据包时,可以使用 SACK 机制告诉发送端已经成功接收到哪些数据包,以便发送端避免重复发送数据包。
- 另外,TCP 还支持延迟确认机制。当接收端收到数据包时,不会立即发送确认号,而是等待一段时间,如果在这段时间内没有收到更多的数据包,则会发送确认号。这种机制可以减少确认消息的数量,提高网络性能。
收到 IP 数据包解析后,怎么知道这个分组是 TCP 还是 UDP 协议?
在 IP 数据包中,TCP 和 UDP 协议在 IP 数据包的头部都有自己的协议字段(Protocol field)来标识。该字段的位置在 IP 数据包头的第 9 个字节,它的取值范围是 0-255,其中 6 代表 TCP 协议,17 代表 UDP 协议。因此,只需要读取 IP 数据包头部的第 9 个字节的值,就可以判断该数据包使用的是 TCP 协议还是 UDP 协议。
什么是 HTTP?
HTTP (HyperText Transfer Protocol),即超文本运输协议,是实现网络通信的一种规范,它常用于在 Web 浏览器和网站服务器之间传递信息,具有如下特点:
- 明文传输
- 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
- 无状态:客户端和服务器没有建立持续的连接,服务器不保留连接的相关信息,HTTP 协议也就无法根据之前的状态进行本次的请求处理。
- 灵活:HTTP 允许传输任意类型的数据对象。正在传输的类型由 Content-Type 进行标记。
- 简单快速:客户向服务器请求服务时,只需传送请求方法和路径,简单方便,也因为 HTTP 协议简单,使得 HTTP 服务器的程序规模小,因而通信速度很快。
HTTP 遵循请求(Request)/应答(Response)模型,即客户端向服务器发送请求,服务器接收并响应请求,并返回适当的应答。
HTTP 和 HTTPS 的区别是什么?
HTTP (Hypertext Transfer Protocol) 是一种用于在计算机之间传输数据的协议,它是 Web 上最常用的协议之一。HTTP 用于在 Web 浏览器与 Web 服务器之间传输 HTML 页面、图片、视频、音频、文本等资源。
HTTPS (Hypertext Transfer Protocol Secure) 是 HTTP 协议的安全版本。HTTPS 通过使用 SSL 或 TLS 协议(Secure Sockets Layer 或 Transport Layer Security)对传输的数据进行加密,从而确保数据在传输过程中不被窃听、篡改或冒充。HTTPS 能够保护用户数据的安全性和隐私性,防止黑客攻击和中间人攻击等网络安全问题。
因此,HTTP 和 HTTPS 的主要区别在于数据传输时是否进行加密。HTTP 不加密数据,而 HTTPS 使用 SSL 或 TLS 对数据进行加密。由于 HTTPS 提供更高的安全性,现在越来越多的网站正在转向使用 HTTPS。
HTTPS 是如何通过 TLS (Transport Layer Security) 协议来保证数据安全的?
HTTPS 使用 TLS (Transport Layer Security) 协议来保证传输的数据安全,并使用 TLS 握手协议来建立安全通道。TLS 握手协议包括以下几个步骤:
- 客户端发送 Client Hello:客户端向服务器发送 Client Hello 报文,该报文包含了客户端支持的 TLS 版本、加密算法、随机数等信息。
- 服务器发送 Server Hello 和证书:服务器根据客户端的请求,选择一个 TLS 版本以及一组加密算法,并向客户端发送 Server Hello 报文和数字证书。数字证书中包含了服务器的公钥和一些服务器身份信息,如服务器域名、公司名称等。
- 客户端验证证书:客户端使用内置的认证机构的公钥来验证服务器的数字证书的有效性,包括证书的合法性、颁发机构的合法性和证书中包含的服务器域名是否与实际访问的域名一致。
- 客户端生成加密密钥:如果证书验证通过,客户端生成一个用于加密通信的随机数,称为 Pre-master Secret,并使用服务器公钥进行加密,然后将加密后的 Pre-master Secret 发送给服务器。
- 服务器解密 Pre-master Secret:服务器使用自己的私钥来解密 Pre-master Secret,然后生成一个用于加密通信的随机数,称为 Master Secret,该密钥只在客户端和服务器之间共享,不会被传输。
- 客户端和服务器生成加密密钥:客户端和服务器使用 Pre-master Secret 和 Master Secret 生成用于加密和解密通信的对称密钥,称为 Session Key。
- 客户端和服务器确认握手过程:客户端和服务器互相发送 Finished 报文,以确认握手过程。
- 客户端和服务器开始加密通信:客户端和服务器使用 Session Key 来加密和解密通信,保证通信的安全性。
TLS 握手协议是建立 HTTPS 安全通道的关键,它通过交换信息、验证证书、生成密钥等步骤来确保客户端和服务器之间的通信安全。
HTTPS 是如何防止中间人攻击的?
中间人攻击是指攻击者通过在客户端和服务器之间插入自己的设备或软件,窃取或篡改数据的一种攻击方式。在中间人攻击中,攻击者可以获取到客户端和服务器之间的通信内容,甚至可以篡改通信内容,从而破坏通信的机密性和完整性。
HTTPS 通过使用 SSL/TLS 协议来防止中间人攻击,具体来说,有以下几个方面:
- 数字证书:HTTPS 使用数字证书来验证服务器的身份,客户端会使用内置的认证机构的公钥来验证服务器的数字证书的有效性。如果验证通过,客户端就可以使用证书中包含的服务器公钥来建立安全通信通道。这样可以确保客户端和服务器之间的通信是安全的,防止中间人窃取数据。
- 对称加密算法:HTTPS 使用对称加密算法来加密数据,对称加密算法的密钥会在通信开始时由服务器发送给客户端,客户端使用服务器的公钥来加密对称密钥,服务器使用自己的私钥来解密对称密钥。之后客户端和服务器之间的通信就可以使用对称加密算法进行加密和解密,从而防止中间人窃取数据。
- 非对称加密算法:HTTPS 使用非对称加密算法来建立加密通道和身份认证,客户端和服务器之间的通信会使用非对称加密算法来加密和解密数据,从而确保传输的数据的完整性和机密性,防止中间人篡改数据。
telnet 是什么?
telnet 是一种用于远程登录到计算机或服务器的网络协议。它通过 TCP/IP 协议提供连接,使用户能够在远程计算机上执行命令或访问应用程序。但是,由于 Telnet 协议不加密数据传输,因此在安全性方面存在一些问题,现在已经被 SSH 协议所取代。
可以通过如下命令检查主机 192.168.0.100 的端口 80 是否打开:
netstat 是什么?
netstat(网络统计)是一个命令行工具,用于显示网络连接、网络接口和网络协议统计信息。它可以显示当前正在运行的网络连接和它们的状态,例如建立连接、监听连接或关闭连接等。此外,netstat 还可以显示网络接口的信息,包括 IP 地址、MAC 地址和其他相关信息。通过使用不同的选项和参数,netstat 可以提供各种详细的网络统计信息,从而帮助网络管理员进行网络故障排除和性能优化等工作。netstat 是一个跨平台的工具,可以在 Windows、Linux 和 Mac 等操作系统上使用。
如
netstat -vanp tcp | grep 3000
这条命令列出了所有正在运行的 TCP 连接,并使用详细模式显示它们的状态和相关信息,然后使用 grep 过滤出端口号为 3000 的连接。tcpdump 是什么?
tcpdump是一个在命令行下运行的网络抓包工具,用于捕获和分析网络数据包。它可以在大多数操作系统上运行,包括Unix、Linux、macOS和Windows等。
tcpdump能够捕获经过计算机网络接口的数据包,并可以将捕获到的数据包进行分析和解释。它可以用来诊断网络故障、分析网络性能、检测网络安全漏洞等。tcpdump可以捕获各种协议的网络数据包,包括TCP、UDP、ICMP、HTTP、DNS等。
如使用
tcpdump -i any host 127.0.0.1
监听和 127.0.0.1
的交互。TCP 和 UDP 的区别是什么?
TCP (Transmission Control Protocol) 和 UDP (User Datagram Protocol) 都是在互联网协议中常用的传输层协议,它们有以下区别:
- 连接方式:TCP 是面向连接的协议,UDP 是面向无连接的协议。在 TCP 中,发送和接收数据之前必须首先建立连接,而在 UDP 中可以直接发送数据。
- 可靠性:TCP 是一种可靠的协议,它通过使用序列号、确认应答和重传机制来保证数据的可靠传输。而 UDP 并不提供可靠性保证,它只是简单地发送数据包,不保证数据包的到达和顺序。
- 数据量限制:TCP 没有数据量限制,而 UDP 数据包的大小会被限制在 64KB 以内。
- 速度:由于 TCP 提供了可靠性保证,因此它的传输速度比 UDP 慢,而 UDP 可以快速地传输数据,因为它不需要建立连接和保证数据的可靠性。
- 应用场景:TCP 通常用于需要可靠性保证的应用程序,如电子邮件、文件传输和网页浏览等。而 UDP 通常用于需要快速传输数据的应用程序,如视频流、音频流和在线游戏等。
如果已经建立连接了,但是客户端突然出现故障了,怎么办?
TCP 设有一个保活计时器,一般为两个小时,在正常的传输过程中,服务器每接收到一次客户端的请求,都会重置这个计数器,若两个小时还没接收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔 75 秒发送一次,若一连发送 10 个探测报文段仍然没有反应,服务器就会直接关闭连接。
四次挥手的过程中,服务器在发送完最后一个 FIN 信息后,为什么要等待 2MSL(maximum segment lifetime)的时间?
- 保证客户端接收到 FIN 信息后,回复的 ACK 信息能够被接收到,如果客户端没有回复 ACK 信息,服务器会重新发送 FIN 信息,并重置等待时间。
- 为了确保“迷途”数据重新出现在本连接中。当服务器发送完最后一个 FIN 信息,在 2MSL 时间内,本连接持续时间内产生的所有报文段都会从网络中消失。这样新的连接中就不会出现旧的报文。
从浏览器输入 URL 到显示主页,期间发生了什么?
- 浏览器通过域名查找到对应的 IP 地址;
- 浏览器和服务器通过三次握手建立连接;
- 浏览器向服务器发送请求;
- 服务器处理请求,返回数据;
- 浏览器解析数据并开始渲染页面;
- 浏览器和服务器通过四次挥手断开连接。
HTTP 请求的传输过程是怎样的?
- 地址解析:DNS 解析获得协议、主机、端口和对象路径;
- 封装 HTTP 请求数据包
- 封装 TCP 包:
- 通过三次握手建立 TCP 连接:
- 客户端发送请求:
- 服务器响应:响应的结果中包含响应头、协议版本号、状态码、响应体等信息。
- 服务器关闭 TCP 连接
HTTP1.0、HTTP1.1 和 HTTP2.0 之间的区别是什么?
- HTTP 1.0 默认是短连接,每次请求都需要建立一个 TCP 连接;
- HTTP1.1 默认是长连接,引入的持久连接能够保证 TCP 连接默认不关闭,可以被多个请求重复使用,并且引入了管道机制(Pipelining),即在同一个 TCP 连接里,客户端可以发送多个请求。
- HTTP2.0 引入了多路复用,客户端和服务器都可以同时发送多个请求或回应,而且不用按照顺序一一对应,并且做了 Header 压缩、服务端推送等机制。
什么是 HTTPS?
HTTPS 是以安全为目标的 HTTP 通道,它在 HTTP 的基础上加入 SSL 层(位于表示层中)以提高数据传输的安全性。SSL 依靠证书来验证服务器的身份,并对浏览器和服务器之间的通信数据进行加密。
HTTPS 的加密流程是怎样的?
- 客户端和服务器通过 TCP 建立连接之后,客户端向服务器发起请求验证证书;
- 服务器响应证书,并在证书中包含公钥、数据加密算法等信息。
- 客户端验证证书并生成对称密钥,并通过公钥加密,将数据传输给服务器。
- 服务器通过私钥解密获得对称密钥。
- 客户端和服务器通过对称密钥进行数据传输。
TCP 的粘包是什么?为什么会发生粘包?如何解决?
TCP 连接在传输的过程中,会根据缓冲区大小,将一个完整的数据拆分成多个包或者将多个数据包合并成一个包进行传输。
粘包就是指发送方发送的若干数据包,到达接收方时,粘成了一个包。
粘包有可能是发送方造成的,比如发送端使用了 Nagle 算法减少网络中报文段的数量,也有可能是接收方造成的,比如接收数据的服务端没有及时读取 TCP Recv Buffer 中的数据。
常见的解决办法有:
- 给消息带上边界标示;
- 在发送消息时,将消息的长度一起发送给服务器;
TCP 如何进行流量控制?
TCP 通过窗口机制来实现流量控制,具体的执行逻辑为在建立连接时,服务器就会告知客户端自己能够接收的缓存的大小,同时,发送方根据当前的网络环境,通过估计,确定发送窗口的实际大小。
什么是拥塞控制?
拥塞控制就是为了防止发送方发送的数据占满整个网络,会通过网络的拥塞程度,动态调整拥塞窗口的大小。网络良好的情况下,窗口就会动态增大,网络出现拥塞时,窗口就会动态缩小。
拥塞控制主要是四个算法:
- 慢启动:刚刚建立连接时,当发送方每接收到一个 ACK,拥塞窗口的大小就会加 1。
- 拥塞避免:发送方每接受到一个 ACK,拥塞窗口的大小增加 1/cwnd。
- 拥塞发生
- 超时重传:cwnd 重置为初始化阶段的大小。
- 快速重传:cwnd 减少为原来的一半。
- 快速恢复:先将 cwnd 减少到原来的一半,然后每接收一个 ACK,窗口加 1,当旧的 ACK 全部传输完毕后,cwnd 减少至原来的一半,进入拥塞避免算法。
拥塞控制和流量控制的区别是什么?
拥塞控制针对现有网络能够承受的网络负荷的调整,是一个全局性的过程,涉及所有主机、路由器及网络传输性能相关的因素。
流量控制是点对点的通信量的控制,即接收端控制发送端,抑制发送端的发送速率。
拔掉网线后,原有的 TCP 连接还在吗?
TCP 连接在 Linux 操作系统中是一个名为 struct socket 的结构体,该结构体包含 TCP 的连接状态等信息,当拔掉网线时,操作系统并不会改变该结构体的任何内容,所以 TCP 的连接状态也不会发生改变。
TCP 的 keepalive 和 HTTP 的 keep-alive 是一个东西吗?
- HTTP 的 keep-alive 是应用态实现的,称为 HTTP 长连接。
- TCP 的 keepalive 是内核态实现的,称为 TCP 保活机制。
为什么每次建立连接时,初始化的序列号都不一样呢?
- 为了防止报文被下一个相同的连接(源地址、源端口、目的地址、目的端口)接收。
- 为了防止黑客伪造相同的请求。
TCP 第一次握手丢失会发生什么?
会进行超时重传,重试的次数由 tcp_syn_retries 内核参数决定,默认为 5。第一次超时重传是在 1 秒后,每次超时重传的时间是上一次的两倍。当第 5 次超时重传后,会继续等待 32 秒,如果服务器仍然没有回应 ACK,客户端就不再发送 SYN 包,直接断开 TCP 连接。
TCP 第二次握手丢失会发生什么?
- 客户端会重传 SYN 报文;
- 服务端会重传 SYN+ACK 报文;
TCP 第三次握手丢失会发生什么?
- 服务端重新发送 ACK+SYN;
- 客户端根据 SYN 返回 ACK,并直接进入 ESTABLISH 状态。