1. CN基础
1. 网络分层模型
1. OSI 七层模型 :复杂不实用,功能重复。
2. TCP/IP 四层模型 : OSI 七层模型的精简版本
应用层 -> 传输层 -> 网络层 -> 网络接口层
1. 应用层 (Application layer)
主要提供两个终端设备上的应用程序之间信息交换的服务,它定义了信息交换的格式,消息会交给下一层传输层来传输。
交互的数据单元称为报文。
应用层协议定义了网络通信规则,对于不同的网络应用需要不同的应用层协议。
应用层常见协议:
基于TCP协议:
-
HTTP(Hypertext Transfer Protocol,超文本传输协议)
-
SMTP(Simple Mail Transfer Protocol,简单邮件发送协议)
-
POP3/IMAP(邮件接收协议)
-
FTP(File Transfer Protocol,文件传输协议)
-
Telnet(远程登陆协议)
-
SSH(Secure Shell Protocol,安全的网络传输协议)
基于UDP协议:
-
RTP(Real-time Transport Protocol,实时传输协议)
-
DNS(Domain Name System,域名管理系统)
2. 传输层(Transport)
向两台终端设备进程之间的通信提供通用的数据传输服务。
应用进程利用该服务传送应用层报文。
传输层常见协议:
-
TCP(Transmission Control Protocol,传输控制协议 ):提供 面向连接 的,可靠 的数据传输服务。
-
UDP(User Datagram Protocol,用户数据协议):提供 无连接 的,尽最大努力 的数据传输服务(不保证数据传输的可靠性),简单高效。
3. 网络层(Network)
为分组交换网上的不同主机提供通信服务,把运输层产生的报文段或用户数据报封装成分组和包进行传送。在 TCP/IP 体系结构中,由于网络层使用 IP 协议,因此分组也叫 IP 数据报,简称数据报。
选择合适的路由,使源主机运输层所传下来的分组,能通过网络层中的路由器找到目的主机。
互联网是由大量的异构(heterogeneous)网络通过路由器(router)相互连接起来的。
转发与路由:
-
转发:将分组从路由器的输入端口转移到合适的输出端口。
-
路由:确定分组从源到目的经过的路径。
网络层常见协议:
-
IP(Internet Protocol,网际协议):TCP/IP 协议中最重要的协议之一,属于网络层的协议,主要作用是定义数据包的格式、对数据包进行路由和寻址,以便它们可以跨网络传播并到达正确的目的地。目前 IP 协议主要分为两种,一种是过去的 IPv4,另一种是较新的 IPv6,目前这两种协议都在使用,但后者已经被提议来取代前者。
-
ARP(Address Resolution Protocol,地址解析协议):ARP 协议解决的是网络层地址和链路层地址之间的转换问题。因为一个 IP 数据报在物理上传输的过程中,总是需要知道下一跳(物理上的下一个目的地)该去往何处,但 IP 地址属于逻辑地址,而 MAC 地址才是物理地址,ARP 协议解决了 IP 地址转 MAC 地址的一些问题。
-
ICMP(Internet Control Message Protocol,互联网控制报文协议):一种用于传输网络状态和错误消息的协议,常用于网络诊断和故障排除。例如,Ping 工具就使用了 ICMP 协议来测试网络连通性。
-
NAT(Network Address Translation,网络地址转换协议):NAT 协议的应用场景如同它的名称——网络地址转换,应用于内部网到外部网的地址转换过程中。具体地说,在一个小的子网(局域网,LAN)内,各主机使用的是同一个 LAN 下的 IP 地址,但在该 LAN 以外,在广域网(WAN)中,需要一个统一的 IP 地址来标识该 LAN 在整个 Internet 上的位置。
-
OSPF(Open Shortest Path First,开放式最短路径优先):一种内部网关协议(Interior Gateway Protocol,IGP),也是广泛使用的一种动态路由协议,基于链路状态算法,考虑了链路的带宽、延迟等因素来选择最佳路径。
-
RIP (Routing Information Protocol,路由信息协议):一种内部网关协议(Interior Gateway Protocol,IGP),也是一种动态路由协议,基于距离向量算法,使用固定的跳数作为度量标准,选择跳数最少的路径作为最佳路径。
-
BGP(Border Gateway Protocol,边界网关协议)**:一种用来在路由选择域之间交换网络层可达性信息(Network Layer Reachability Information,NLRI)的路由选择协议,具有高度的灵活性和可扩展性。
4. 网络接口层(Network Interface)
数据链路层和物理层的合体。
-
数据链路层(data link layer):通常简称为链路层( 两台主机之间的数据传输,总是在一段一段的链路上传送的)。将网络层交下来的 IP 数据报组装成帧,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)。
-
物理层:相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。
3. 为什么要分层?
复杂的系统需要分层,因为每一层都需要专注于一类事情。网络分层的原因也是一样,每一层只专注于做一类事情。
-
各层之间相互独立:各层之间相互独立,各层之间不需要关心其他层是如何实现的,只需要知道自己如何调用下层提供好的功能就可以了(可以简单理解为接口调用)。
-
提高了灵活性和可替换性:每一层都可以使用最适合的技术来实现,你只需要保证你提供的功能以及暴露的接口的规则没有改变就行了。并且,每一层都可以根据需要进行修改或替换,而不会影响到整个网络的结构。(高内聚、低耦合)
-
大问题化小:分层可以将复杂的网络问题分解为许多比较小的、界线比较清晰简单的小问题来处理和解决。这样使得复杂的计算机网络系统变得易于设计,实现和标准化。 (系统功能分解)
2. HTTP (应用层)
1. 访问网页的全过程
-
在浏览器中输入指定网页的 URL。
-
浏览器通过 DNS 协议,获取域名对应的 IP 地址。
-
浏览器根据 IP 地址和端口号,向目标服务器发起一个 TCP 连接请求。
-
浏览器在 TCP 连接上,向服务器发送一个 HTTP 请求报文,请求获取网页的内容。
-
服务器收到 HTTP 请求报文后,处理请求,并返回 HTTP 响应报文给浏览器。
-
浏览器收到 HTTP 响应报文后,解析响应体中的 HTML 代码,渲染网页的结构和样式,同时根据 HTML 中的其他资源的 URL(如图片、CSS、JS 等),再次发起 HTTP 请求,获取这些资源的内容,直到网页完全加载显示。
-
浏览器在不需要和服务器通信时,可以主动关闭 TCP 连接,或者等待服务器的关闭请求。
2. 状态码
描述HTTP请求结果
2xx Success(成功状态码)
-
200 OK:请求被成功处理。比如我们发送一个查询用户数据的 HTTP 请求到服务端,服务端正确返回了用户数据。这个是我们平时最常见的一个 HTTP 状态码。
-
201 Created:请求被成功处理并且在服务端创建了一个新的资源。比如我们通过 POST 请求创建一个新的用户。
-
202 Accepted:服务端已经接收到了请求,但是还未处理。
-
204 No Content:服务端已经成功处理了请求,但是没有返回任何内容。
3xx Redirection(重定向状态码)
-
301 Moved Permanently:资源被永久重定向了。比如你的网站的网址更换了。
-
302 Found:资源被临时重定向了。比如你的网站的某些资源被暂时转移到另外一个网址。
4xx Client Error(客户端错误状态码)
-
400 Bad Request:发送的 HTTP 请求存在问题。比如请求参数不合法、请求方法错误。
-
401 Unauthorized:未认证却请求需要认证之后才能访问的资源。
-
403 Forbidden:直接拒绝 HTTP 请求,不处理。一般用来针对非法请求。
-
404 Not Found:你请求的资源未在服务端找到。比如你请求某个用户的信息,服务端并没有找到指定的用户。
-
409 Conflict:表示请求的资源与服务端当前的状态存在冲突,请求无法被处理。
5xx Server Error(服务端错误状态码)
-
500 Internal Server Error:服务端出问题了(通常是服务端出 Bug 了)。比如你服务端处理请求的时候突然抛出异常,但是异常并未在服务端被正确处理。
-
502 Bad Gateway:我们的网关将请求转发到服务端,但是服务端返回的却是一个错误的响应。
3. Header常见字段
4. HTTP vs HTTPS
HTTP 协议
全称超文本传输协议(Hypertext Transfer Protocol)。规范超文本的传输,超文本,也就是网络上的包括文本在内的各式各样的消息,具体来说,主要是来规范浏览器和服务器端的行为的。
无状态(stateless)协议,也就是说服务器不维护任何有关客户端过去所发请求的消息。
HTTP 是应用层协议,它以 TCP(传输层)作为底层协议,默认端口为 80
通信过程主要如下:
-
服务器在 80 端口等待客户的请求。
-
浏览器发起到服务器的 TCP 连接(创建套接字 Socket)。
-
服务器接收来自浏览器的 TCP 连接。
-
浏览器(HTTP 客户端)与 Web 服务器(HTTP 服务器)交换 HTTP 消息。
-
关闭 TCP 连接。
扩展性强、速度快、跨平台支持性好。
HTTPS 协议(Hyper Text Transfer Protocol Secure)
是 HTTP 的加强安全版本。HTTPS 是基于 HTTP 的,也是用 TCP 作为底层协议,并额外使用 SSL/TLS 协议用作加密和安全认证。默认端口号是 443
HTTPS 协议中,SSL 通道通常使用基于密钥的加密算法。HTTPS 比 HTTP 耗费更多服务器资源。
保密性好、信任度高。
特性 | HTTP | HTTPS |
---|---|---|
1.安全性 | 不安全,数据以明文形式传输,易被第三方截取和查看 | 安全,使用 TLS/SSL 协议加密数据包,防止拦截和篡改 |
2.加密方式 | 无 | 使用 TLS/SSL 协议加密数据包 |
3.端口号 | 80 | 443 |
4.URL 标识 | 以 "http://" 开头 | 以 "https://" 开头 |
5.证书 | 不需要 | 需要 SSL 证书,由可信任的证书颁发机构(CA)颁发,用于验证服务器身份 |
6.性能 | 通常较高 | 可能略低,由于加密和解密过程带来一些计算开销,但随着技术进步,差异逐渐减小 |
SSL/TLS 协议
非对称加密 采用两个密钥——一个公钥,一个私钥。在通信时,私钥仅由解密者保存,公钥由任何一个想与解密者通信的发送者(加密者)所知。可以设想一个场景,
对称加密:通信双方共享唯一密钥 k,加解密算法已知,加密方利用密钥 k 加密,解密方利用密钥 k 解密,保密性依赖于密钥 k 的保密性。
-
非对称加密:用于身份验证和密钥交换,确保只有拥有私钥的一方能解密信息。
-
对称加密:用于实际数据传输,加密和解密效率高,适合大量数据的快速加密。
公钥传输的信赖性依赖于数字证书,这些证书由受信任的证书颁发机构(CA)签署和颁发。客户端通过验证证书的签名,确保公钥确实来自合法的服务器,从而防止中间人攻击和伪造身份。
数字签名,是 CA 在给服务器颁发证书时,使用散列+加密的组合技术,在证书上盖个章,以此来提供验伪的功能。
❗️文件内容是否被篡改?发送者是否冒充?数字证书是否被伪造?
通过RSA加密算法(双向)得到公钥和私钥。 私钥对文件哈希值签名, 公钥用来验证运算得到文件哈希值,再与文件得到的哈希值对比。
哈希算法(单向),hash值不匹配则文件内容被篡改。
公钥与私钥成对,数字证书确定公钥生成者。
CA根据公钥和生成者信息,生成数字证书。
根证书预先安装在系统里,记录了可信赖的CA机构信息及其公钥。
数字证书相当于文件和签名的结合体。
5. HTTP 2.0 vs 3.0
-
传输协议:HTTP/2.0 是基于 TCP 协议实现的,HTTP/3.0 新增了 QUIC(Quick UDP Internet Connections) 协议来实现可靠的传输,提供与 TLS/SSL 相当的安全性,具有较低的连接和传输延迟。你可以将 QUIC 看作是 UDP 的升级版本,在其基础上新增了很多功能比如加密、重传等等。HTTP/3.0 之前名为 HTTP-over-QUIC,从这个名字中我们也可以发现,HTTP/3 最大的改造就是使用了 QUIC。
-
连接建立:HTTP/2.0 需要经过经典的 TCP 三次握手过程(由于安全的 HTTPS 连接建立还需要 TLS 握手,共需要大约 3 个 RTT)。由于 QUIC 协议的特性(TLS 1.3,TLS 1.3 除了支持 1 个 RTT 的握手,还支持 0 个 RTT 的握手)连接建立仅需 0-RTT 或者 1-RTT。这意味着 QUIC 在最佳情况下不需要任何的额外往返时间就可以建立新连接。
-
队头阻塞:HTTP/2.0 多请求复用一个 TCP 连接,一旦发生丢包,就会阻塞住所有的 HTTP 请求。由于 QUIC 协议的特性,HTTP/3.0 在一定程度上解决了队头阻塞(Head-of-Line blocking, 简写:HOL blocking)问题,一个连接建立多个不同的数据流,这些数据流之间独立互不影响,某个数据流发生丢包了,其数据流不受影响(本质上是多路复用+轮询)。
-
错误恢复:HTTP/3.0 具有更好的错误恢复机制,当出现丢包、延迟等网络问题时,可以更快地进行恢复和重传。而 HTTP/2.0 则需要依赖于 TCP 的错误恢复机制。
-
安全性:HTTP/2.0 和 HTTP/3.0 在安全性上都有较高的要求,支持加密通信,但在实现上有所不同。HTTP/2.0 使用 TLS 协议进行加密,而 HTTP/3.0 基于 QUIC 协议,包含了内置的加密和身份验证机制,可以提供更强的安全性。
6. HTTP无状态,如何保存用户状态?
HTTP 协议自身不对请求和响应之间的通信状态进行保存。
Session 机制:通过服务端记录用户的状态。常用的就是内存和数据库(比如是使用内存数据库 redis 保存),通过在 Cookie 中附加一个 Session ID 来方式来跟踪。
Cookie被禁?利用 URL 重写把 Session ID 直接附加在 URL 路径的后面。
7. URL vs URI
-
URI(Uniform Resource Identifier) 是统一资源标志符,可以唯一标识一个资源。
-
URL(Uniform Resource Locator) 是统一资源定位符,可以提供该资源的路径。它是一种具体的 URI,即 URL 可以用来标识一个资源,而且还指明了如何 locate 这个资源。
URI 的作用像身份证号一样,URL 的作用更像家庭住址一样。URL 是一种具体的 URI,它不仅唯一标识资源,而且还提供了定位该资源的信息。
8. Cookie vs Session
3. WebSocket(应用层)
1. what
基于 TCP 连接的全双工通信协议,即客户端和服务器可以同时发送和接收数据。
应用层的协议,用于弥补 HTTP 协议在持久通信能力上的不足。客户端和服务器仅需一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
-
视频弹幕
-
实时消息推送
-
实时游戏对战
-
多用户协同编辑
-
社交聊天
特性 | 全双工通信(Full Duplex Communication) | 半双工通信(Half Duplex Communication) |
---|---|---|
数据传输方向 | 数据可以同时在两个方向上进行传输,即同时发送和接收 | 数据传输是单向的,同一时间内只能在一个方向上传输 |
时序特性 | 发送方和接收方可以同时工作,彼此之间互不干扰 | 同一时间内,通信双方只能执行发送或接收操作,不能同时进行 |
例子 | 电话通信:双方可以同时说话和听对方说话 | 对讲机:一方说话时另一方必须静听,不能同时进行双向通信 |
通信效率 | 更高,因为允许同时进行双向数据传输 | 较低,因为同一时间内只能进行单向数据传输 |
硬件和协议支持 | 需要更复杂的硬件和协议支持 | 相对简单的硬件和协议支持 |
2. websocket vs http
特性 | WebSocket | HTTP |
---|---|---|
通信模式 | 双向实时通信 | 单向通信(请求-响应模式) |
客户端-服务器通信 | 双向,服务器可以主动发送消息给客户端 | 只能由客户端发起请求,服务器响应 |
协议前缀 | ws:// 或 wss:// | http:// 或 https:// |
安全性 | 支持 SSL/TLS 加密(wss://) | 支持 SSL/TLS 加密(https://) |
协议扩展 | 支持扩展,允许实现自定义的子协议,如压缩、加密等 | 不支持协议扩展 |
数据格式 | 轻量,协议控制的数据包头部较小,网络开销小 | 较重,每次通信都要携带完整的头部,网络开销较大(HTTP/2.0 使用二进制帧进行数据传输,支持头部压缩,减少网络开销) |
使用场景 | 实时应用,如聊天、游戏、股票行情等 | 静态内容传输,如网页浏览、文件下载等 |
3. 工作过程
-
客户端向服务器发送一个 HTTP 请求,请求头中包含
Upgrade: websocket
和Sec-WebSocket-Key
等字段,表示要求升级协议为 WebSocket -
服务器收到这个请求后,会进行升级协议的操作,如果支持 WebSocket,它将回复一个 HTTP 101 状态码,响应头中包含 ,
Connection: Upgrade
和Sec-WebSocket-Accept: xxx
等字段、表示成功升级到 WebSocket 协议 -
客户端和服务器之间建立了一个 WebSocket 连接,可以进行双向的数据传输。数据以帧(frames)的形式进行传送,WebSocket 的每条消息可能会被切分成多个数据帧(最小单位)。发送端会将消息切割成多个帧发送给接收端,接收端接收消息帧,并将关联的帧重新组装成完整的消息。
-
客户端或服务器可以主动发送一个关闭帧,表示要断开连接。另一方收到后,也会回复一个关闭帧,然后双方关闭 TCP 连接。
建立 WebSocket 连接之后,通过心跳机制来保持 WebSocket 连接的稳定性和活跃性。
心跳机制: 客户端和服务器之间定期发送小型的探测消息,以维持连接的活跃状态。这些探测消息通常被称为心跳包,它们的目的是防止连接由于长时间的不活动而被中断,同时可以用于检测网络异常或连接丢失的情况,从而及时采取相应的处理措施。
实时消息推送
4. PING
1. what
常用的网络诊断工具,经常用来测试网络中主机之间的连通性和网络延迟。
# 发送4个PING请求数据包到 www.baidu.com ❯ ping -c 4 www.baidu.com PING www.a.shifen.com (14.119.104.189): 56 data bytes 64 bytes from 14.119.104.189: icmp_seq=0 ttl=54 time=27.867 ms 64 bytes from 14.119.104.189: icmp_seq=1 ttl=54 time=28.732 ms 64 bytes from 14.119.104.189: icmp_seq=2 ttl=54 time=27.571 ms 64 bytes from 14.119.104.189: icmp_seq=3 ttl=54 time=27.581 ms --- www.a.shifen.com ping statistics --- 4 packets transmitted, 4 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 27.571/27.938/28.732/0.474 ms
-
ICMP Echo Request(请求报文)信息:序列号、TTL(Time to Live)值。
-
目标主机的域名或 IP 地址:输出结果的第一行。
-
往返时间(RTT,Round-Trip Time):从发送 ICMP Echo Request(请求报文)到接收到 ICMP Echo Reply(响应报文)的总时间,用来衡量网络连接的延迟。
-
统计结果(Statistics):包括发送的 ICMP 请求数据包数量、接收到的 ICMP 响应数据包数量、丢包率、往返时间(RTT)的最小、平均、最大和标准偏差值。
往返时间(RTT)过高,则表明网络延迟过高。
2. 原理
基于网络层的 ICMP(Internet Control Message Protocol,互联网控制报文协议)。 其主要原理就是通过在网络上发送和接收 ICMP 报文实现的。
-
查询报文类型:向目标主机发送请求并期望得到响应。
-
差错报文类型:向源主机发送错误信息,用于报告网络中的错误情况。
5. DNS(应用层)
1. what
域名管理系统,解决的是域名和 IP 地址的映射问题。
目前 DNS 的设计采用的是分布式、层次数据库结构,应用层协议,它可以在 UDP 或 TCP 协议之上运行,端口为 53
2. DNS服务器有哪些?
-
根 DNS 服务器。根 DNS 服务器提供 TLD 服务器的 IP 地址。目前世界上只有 13 组根服务器,我国境内目前仍没有根服务器。
-
顶级域 DNS 服务器(TLD 服务器)。顶级域是指域名的后缀,如
com
、org
、net
和edu
等。国家也有自己的顶级域,如uk
、fr
和ca
。TLD 服务器提供了权威 DNS 服务器的 IP 地址。 -
权威 DNS 服务器。在因特网上具有公共可访问主机的每个组织机构必须提供公共可访问的 DNS 记录,这些记录将这些主机的名字映射为 IP 地址。
-
本地 DNS 服务器。每个 ISP(互联网服务提供商)都有一个自己的本地 DNS 服务器。当主机发出 DNS 请求时,该请求被发往本地 DNS 服务器,它起着代理的作用,并将该请求转发到 DNS 层次结构中。严格说来,不属于 DNS 层级结构
3. DNS解析过程
从请求主机到本地 DNS 服务器的查询是递归的(对于被查询的域名服务器负担太大),其余的查询时迭代的。
-
迭代 (查一返一)
-
递归(查到底再返回)
4. DNS劫持
通过某些手段取得某域名的解析控制权,修改此域名的解析结果,导致对该域名的访问由原IP地址转入到修改后的指定IP,其结果就是对特定的网址不能访问或访问的是假网址。
并不是真的“黑掉”了对方的网站,而是冒名顶替、招摇撞骗罢了。
6. TCP和UDP(传输层)
1. what
TCP | UDP | |
---|---|---|
是否面向连接 | 是 | 否 |
是否可靠 | 是 | 否 |
是否有状态 | 是 | 否 |
传输效率 | 较慢 | 较快 |
传输形式 | 字节流 | 数据报文段 |
首部开销 | 20 ~ 60 bytes | 8 bytes |
是否提供广播或多播服务 | 否 | 是 |
-
UDP 即时通信,比如:语音、 视频、直播等等。这些场景对传输数据的准确性要求不是特别高,比如你看视频即使少个一两帧,实际给人的感觉区别也不大。
-
TCP 传输准确性要求特别高的场景,比如文件传输、发送和接收邮件、远程登录等等。
2. TCP三握四挥
建立连接-TCP 三次握手
-
一次握手:客户端发送带有 SYN(SEQ=x) 标志的数据包 -> 服务端,然后客户端进入 SYN_SEND 状态,等待服务端的确认;
-
二次握手:服务端发送带有 SYN+ACK(SEQ=y,ACK=x+1) 标志的数据包 –> 客户端,然后服务端进入 SYN_RECV 状态;
-
三次握手:客户端发送带有 ACK(ACK=y+1) 标志的数据包 –> 服务端,然后客户端和服务端都进入ESTABLISHED 状态,完成 TCP 三次握手。
在此过程中,Linux 内核会维护两个队列来处理并发连接请求:
-
半连接队列(也称 SYN Queue):当服务端收到客户端的 SYN 请求时,此时双方还没有完全建立连接,它会把半连接状态的连接放在半连接队列。
-
全连接队列(也称 Accept Queue):当服务端收到客户端对 ACK 响应时,意味着三次握手成功完成,服务端会将该连接从半连接队列移动到全连接队列。如果未收到客户端的 ACK 响应,会进行重传,重传的等待时间通常是指数增长的。如果重传次数超过系统规定的最大重传次数,系统将从半连接队列中删除该连接信息。
Q: 为什么三次?
目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。
断开连接-TCP 四次挥手
-
第一次挥手:客户端发送一个 FIN(SEQ=x) 标志的数据包->服务端,用来关闭客户端到服务端的数据传送。然后客户端进入 FIN-WAIT-1 状态。
-
第二次挥手:服务端收到这个 FIN(SEQ=X) 标志的数据包,它发送一个 ACK (ACK=x+1)标志的数据包->客户端 。然后服务端进入 CLOSE-WAIT 状态,客户端进入 FIN-WAIT-2 状态。
-
第三次挥手:服务端发送一个 FIN (SEQ=y)标志的数据包->客户端,请求关闭连接,然后服务端进入 LAST-ACK 状态。
-
第四次挥手:客户端发送 ACK (ACK=y+1)标志的数据包->服务端,然后客户端进入TIME-WAIT状态,服务端在收到 ACK (ACK=y+1)标志的数据包后进入 CLOSE 状态。此时如果客户端等待 2MSL 后依然没有收到回复,就证明服务端已正常关闭,随后客户端也可以关闭连接了。
任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了 TCP 连接。
只要四次挥手没有结束,客户端和服务端就可以继续传输数据!
Over -> Got it! -> over too -> release
Q:为什么不能服务端的ACK和FIN合并,变成三次?
因为S端收到FIN时,可能数据还没传输完。
Q:第二次挥手时S端发送的ACK没被接收到怎么办?
C端如果没收到,会重新发送FIN请求。
Q:为什么第四次挥手客户端需要等待 2*MSL(报文段最长寿命)时间后才进入 CLOSED 状态?
防止 Server 没有收到 ACK 而不断重发 FIN。
3. TCP保证可靠传输
-
基于数据块传输
-
对失序数据包重新排序以及去重
-
校验和
-
重传机制
-
流量控制
-
拥塞控制
4. TCP实现流量控制
流量控制是为了控制发送方发送速率,保证接收方来得及接收,通过滑动窗口实现。(接收方发送的确认报文中窗口字段可以用来控制发送方窗口大小,0则不能发送)
点对点通信量的控制。
5. TCP拥塞控制
拥塞:在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。
为了防止过多的数据注入到网络中,这样就可以使网络中的路由器或链路不致过载。
拥塞控制是一个全局性的过程,涉及到所有的主机,所有的路由器,以及与降低网络传输性能有关的所有因素。
TCP 发送方要维持一个 拥塞窗口(cwnd) 的状态变量。拥塞控制窗口的大小取决于网络的拥塞程度,并且动态变化。发送方让自己的发送窗口取为拥塞窗口和接收方的接受窗口中较小的一个。
TCP采取的四种算法:慢开始、 拥塞避免、快重传 和 快恢复。
-
慢开始: 当主机开始发送数据时,如果立即把大量数据字节注入到网络,那么可能会引起网络阻塞,因为现在还不知道网络的符合情况。经验表明,较好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是由小到大逐渐增大拥塞窗口数值。cwnd 初始值为 1,每经过一个传播轮次,cwnd 加倍。
-
拥塞避免: 拥塞避免算法的思路是让拥塞窗口 cwnd 缓慢增大,即每经过一个往返时间 RTT 就把发送方的 cwnd 加1
-
快重传与快恢复: 在 TCP/IP 中能快速恢复丢失的数据包。没有 FRR,如果数据包丢失了,TCP 将会使用定时器来要求传输暂停。在暂停的这段时间内,没有新的或复制的数据包被发送。有了 FRR,如果接收机接收到一个不按顺序的数据段,它会立即给发送机发送一个重复确认。如果发送机接收到三个重复确认,它会假定确认件指出的数据段丢失了,并立即重传这些丢失的数据段。有了 FRR,就不会因为重传时要求的暂停被耽误。 当有单独的数据包丢失时,快速重传和恢复(FRR)能最有效地工作。当有多个数据信息包在某一段很短的时间内丢失时,它则不能很有效地工作。
在网络层也可以使路由器采用适当的分组丢弃策略(如主动队列管理 AQM),以减少网络拥塞的发生。
6. 超时重传如何实现?超时重传时间怎么确定?
发送方发送数据之后,它启动一个定时器,等待目的端确认收到这个报文段。 接收端实体对已成功收到的包发回一个相应的确认信息(ACK)。 如果发送端实体在合理的往返时延(RTT)内未收到确认消息,那么对应的数据包就被假设为已丢失并进行重传。
-
RTT(Round Trip Time):往返时间,也就是数据包从发出去到收到对应 ACK 的时间。
-
RTO(Retransmission Time Out):重传超时时间,即从数据发送时刻算起,超过这个时间便执行重传。
RTO直接影响到 TCP 的性能和效率,应该根据网络的实际状况,动态地进行调整。(根据往返时延(RTT)的测量和变化来估计 RTO 的值。) 太小,会导致不必要的重传,增加网络负担; 太大,会导致数据传输的延迟,降低吞吐量。
RTT 的值会随着网络的波动而变化,所以 TCP 不能直接使用 RTT 作为 RTO。
7. IP(网络层)
1. what
IP(Internet Protocol,网际协议) 是 TCP/IP 协议中最重要的协议之一,属于网络层的协议,主要作用是定义数据包的格式、对数据包进行路由和寻址,以便它们可以跨网络传播并到达正确的目的地。
目前 IP 协议主要分为两种,一种是过去的 IPv4,另一种是较新的 IPv6,目前这两种协议都在使用,但后者已经被提议来取代前者。
2. 什么是IP地址?IP寻址如何工作?
每个连入互联网的设备或域(如计算机、服务器、路由器等)都被分配一个 IP 地址(Internet Protocol address),作为唯一标识符,唯一性和全局性。 每个 IP 地址都是一个字符序列,如 192.168.1.1(IPv4)、2001:0db8:85a3:0000:0000:8a2e:0370:7334(IPv6) 。
当网络设备发送 IP 数据包时,数据包中包含了 源 IP 地址 和 目的 IP 地址 。源 IP 地址用于标识数据包的发送方设备或域,而目的 IP 地址则用于标识数据包的接收方设备或域。这类似于一封邮件中同时包含了目的地地址和回邮地址。
网络设备根据目的 IP 地址来判断数据包的目的地,并将数据包转发到正确的目的地网络或子网络,从而实现了设备间的通信。
3. IP地址过滤
限制或阻止特定 IP 地址或 IP 地址范围的访问。
实际应用中一般会结合其他网络安全措施,如认证、授权、加密等一起使用。单独使用 IP 地址过滤并不能完全保证网络的安全。
4. IPv4 vs IPv6
特性 | IPv4 | IPv6 |
---|---|---|
地址长度 | 32 位 | 128 位 |
地址表示 | 十进制(点分十进制) | 十六进制(冒号分隔) |
地址数量 | 约 43 亿(2^32) | 约 340 亿亿亿亿亿(2^128) |
地址分配 | DHCP、静态配置 | DHCPv6、静态配置、自动配置(SLAAC、DHCPv6) |
地址类型 | 公网 IP 地址和私网 IP 地址 | 公网 IP 地址和本地链接地址 |
子网掩码 | 需要手动设置 | 不再使用子网掩码,使用前缀长度表示 |
可用功能 | NAT、PAT、ARP、ICMP、IGMP、ARP 等 | ICMPv6、多播组管理、移动 IPv6、IPsec 等 |
地址解析 | ARP(地址解析协议) | NDP(邻居发现协议) |
安全性 | 安全性相对较低,需要额外的安全协议来保护 | 安全性较高,内置 IPsec 支持 |
头部格式 | 固定长度的 20 字节 IPv4 头部 | 可选扩展头部,更灵活 |
路由表大小 | 路由表可能会非常大 | IPv6 路由表通常比 IPv4 小 |
兼容性 | 与现有的 IPv4 设备和应用程序兼容 | 需要支持 IPv6 的设备和应用程序 |
部署进度 | 已经广泛部署 | 正在逐步推广部署 |
5. NAT作用
NAT(Network Address Translation,网络地址转换) 主要用于在不同网络之间转换 IP 地址。它允许将私有 IP 地址(如在局域网中使用的 IP 地址)映射为公有 IP 地址(在互联网中使用的 IP 地址)或者反向映射,从而实现局域网内的多个设备通过单一公有 IP 地址访问互联网。
NAT 不光可以缓解 IPv4 地址资源短缺的问题,还可以隐藏内部网络的实际拓扑结构,使得外部网络无法直接访问内部网络中的设备,从而提高了内部网络的安全性。
8. ARP(网络层)
1. MAC地址
媒体访问控制地址(Media Access Control Address)。如果说,互联网中每一个资源都由 IP 地址唯一标识(IP 协议内容),那么一切网络设备都由 MAC 地址唯一标识。
MAC 地址的长度为 6 字节(48 比特),地址空间大小有 280 万亿之多(248),MAC 地址由 IEEE 统一管理与分配,理论上,一个网络设备中的网卡上的 MAC 地址是永久的,不会重复的。
2. ARP协议解决了什么问题?
地址解析协议(Address Resolution Protocol),它解决的是网络层地址和链路层地址之间的转换问题。因为一个 IP 数据报在物理上传输的过程中,总是需要知道下一跳(物理上的下一个目的地)该去往何处,但 IP 地址属于逻辑地址,而 MAC 地址才是物理地址,ARP 协议解决了 IP 地址转 MAC 地址的一些问题。
3. 工作原理
关键词:ARP 表、广播问询、单播响应。
在一个局域网内,每个网络设备都自己维护了一个 ARP 表,记录了某些其他网络设备的 IP 地址-MAC 地址映射关系,该映射关系以 <IP, MAC, TTL>
三元组的形式存储。其中,TTL 为该映射关系的生存周期,典型值为 20 分钟,超过该时间,该条目将被丢弃。
当主机发送 IP 数据报文时(网络层),仅知道目的地的 IP 地址,并不清楚目的地的 MAC 地址,而 ARP 协议就是解决这一问题的。
-
同一局域网内的 MAC 寻址
主机 A 将不得不通过 ARP 协议来获取主机 B 的 MAC 地址,并将 IP 报文封装成链路层帧,发送到下一跳上。
-
主机 A 检索自己的 ARP 表,发现 ARP 表中并无主机 B 的 IP 地址对应的映射条目,也就无从知道主机 B 的 MAC 地址。
-
主机 A 将构造一个 ARP 查询分组,并将其广播到所在的局域网中。
-
主机 A 构造的查询分组将在该局域网内广播,理论上,每一个设备都会收到该分组,并检查查询分组的接收 IP 地址是否为自己的 IP 地址,如果是,说明查询分组已经到达了主机 B,否则,该查询分组对当前设备无效,丢弃之。
-
主机 B 收到了查询分组之后,验证是对自己的问询,接着构造一个 ARP 响应分组,该分组的目的地只有一个——主机 A,发送给主机 A。同时,主机 B 提取查询分组中的 IP 地址和 MAC 地址信息,在自己的 ARP 表中构造一条主机 A 的 IP-MAC 映射记录。 ARP 响应分组具有和 ARP 查询分组相同的构造,不同的是,发送和接受的 IP 地址恰恰相反,发送的 MAC 地址为发送者本身,目标 MAC 地址为查询分组的发送者,也就是说,ARP 响应分组只有一个目的地,而非广播。
-
主机 A 终将收到主机 B 的响应分组,提取出该分组中的 IP 地址和 MAC 地址后,构造映射信息,加入到自己的 ARP 表中。
ARP 协议是一个广播问询,单播响应协议。
-
不同局域网内的 MAC 寻址
而在不同局域网之间,路由器(有多个接口,每个接口都有一个 IP 地址和一个 MAC 地址)利用 IP 地址进行路由,MAC 地址在每一跳中重新解析并封装,确保数据包能够正确传递到目标设备。