八股(3)——计网
- 3. 计算机基础
- 3.1 计算机网络
- OSI 七层模型是什么?每一层的作用是什么?
- TCP/IP 四层模型是什么?每一层的作用是什么?
- 为什么网络要分层?
- TCP 与 UDP 的区别(传输层协议,重要)
- 什么时候选择 TCP,什么时候选 UDP?
- 使用 TCP 的协议有哪些?使用 UDP 的协议有哪些?
- TCP 三次握手和四次挥手(非常重要)
- TCP 如何保证传输的可靠性?(重要)
- IP 协议的作用是什么?
- 什么是 IP 地址?IP 寻址如何工作?
- 什么是IP地址过滤?
- IPv4 和 IPv6 有什么区别?
- NAT 的作用是什么?
- 什么是 Mac 地址?
- ARP 协议解决了什么问题?
- 从输入URL 到页面展示到底发生了什么?(非常重要)
- HTTP是什么?(协议)
- HTTP 状态码有哪些?
- HTTP响应首部
- HTTP 和 HTTPS 有什么区别?(重要)
- HTTP 1.0 和 HTTP 1.1 有什么区别?
- HTTP 是不保存状态的协议, 如何保存用户状态?
- URI 和 URL 的区别是什么?
- GET和POST的区别
- WebSocket
- 什么是 WebSocket?
- WebSocket的工作过程是什么样的?
- WebSocket 和 HTTP 有什么区别?
- PING 命令的作用是什么?
- PING命令的工作原理是什么?
- DNS 的作用是什么?
- DNS 服务器有哪些?根服务器有多少个?
- DNS 劫持了解吗?如何应对?
主要来自javaguide,加上自己的理解,放这里是方便自己时不时打开看看,后续每一次看的时候应该都会逐渐换成自己最新的理解。
3. 计算机基础
3.1 计算机网络
OSI 七层模型是什么?每一层的作用是什么?
OSI 七层模型 是国际标准化组织提出一个网络分层模型
-
应用层:用户APP里面的数据(图片,声音,文字)
-
表示层:用计算机的编码表示APP数据,对数据有加密作用(独创一套编码方式)
-
会话层:建立两个APP直接的会话(淘宝只能用支付宝而不能微信)
-
传输层:建立TCP或UDP连接
-
网络层:基于IP地址进行路由转发(抖音视频传输到手机上:给每个数据包打上IP地址,路由器根据IP地址进行路由转发,最终送到手机客户端)
-
数据链路层:前面的网络层像普通话,数据链路层协议就更像方言
-
物理层:传输原始比特流(二进制),以及定义了数据传输的物理介质、电气特性和机械特性
既然 OSI 七层模型这么厉害,为什么干不过 TCP/IP 四 层模型呢?
的确,OSI 七层模型当时一直被一些大公司甚至一些国家政府支持。这样的背景下,为什么会失败呢?主要有下面几方面原因:
- OSI 的专家缺乏实际经验,他们在完成 OSI 标准时缺乏商业驱动力
- OSI 的协议实现起来过分复杂,而且运行效率很低
- OSI 制定标准的周期太长,因而使得按 OSI 标准生产的设备无法及时进入市场(20 世纪 90 年代初期,虽然整套的 OSI 国际标准都已经制定出来,但基于 TCP/IP 的互联网已经抢先在全球相当大的范围成功运行了)
- OSI 的层次划分不太合理,有些功能在多个层次中重复出现。
OSI 七层模型虽然失败了,但是却提供了很多不错的理论基础。为了更好地去了解网络分层,OSI 七层模型还是非常有必要学习的。
TCP/IP 四层模型是什么?每一层的作用是什么?
TCP/IP 四层模型 是目前被广泛采用的一种模型,我们可以将 TCP / IP 模型看作是 OSI 七层模型的精简版本:
- 应用层(OSI前三层)
- 传输层
- 网络层
- 网络接口层(OSI后两层)
应用层:李四(主机)对张三(主机)说了一句话(功能)
传输层:要传输到张三这个主机上,就需要传到耳朵这个端口上
网络层:找到端口以后,要准确传输。网络层也是类似的,它决定了数据包在网络中的路径,以确保数据能够准确、高效地到达目的地。
网络接口层(数据链路层和物理层的合体):连接层:张三可能是外国人,所以要用通用语英语(0/1电信号)进行传输。物理层:交通通道(光纤电缆)。
反过来就是:物理层收到了英语的话,在连接层转为泰语,在网络层被张三接收到,传输层被耳朵接收到,应用层听到这句话。
1. 应用层(Application layer)
为操作系统或网络应用程序提供访问网络服务的接口。
会话层、表示层和应用层重点:
- 数据传输基本单位为报文;
- 包含的主要协议:FTP(文件传送协议)、Telnet(远程登录协议)、DNS(域名解析协议)、SMTP(邮件传送协议),PoP3协议(邮局协议),HTTP协议(Hyper Text Transfer Protocol)
网络层及以上,每一层都要对上一层发送的数据进行处理(加个头部)。
数据链路层不仅需要加头部,还需要加尾部。
物理层什么都不加,只管发送数据(比特流)。
2. 传输层(Transport layer)
网络层只是根据网络地址将源结点发出的数据包传送到目的结点,而传输层则负责将数据可靠地传送到相应的端口
- 传输层负责将上层数据分段并提供端到端的、可靠的或不可靠的传输以及端到端的差错控制和流量控制问题
- 包含的主要协议:
- 传输控制协议 TCP(Transmisson Control Protocol):文件传输类,保障数据完整性,会有延时
- 用户数据协议 UDP(User Datagram Protocol):视频通话,实时采集,延迟小
- 重要设备:网关
3. 网络层(Network layer)
对子网间的数据包进行路由选择(到底是耳朵听到了,还是手听到了)。此外,网络层还可以实现拥塞控制、网际互连等功能。
- 基本数据单位为P数据报;
- 包含的主要协议:
- IP协议(Internet Protocol,因特网互联协议);
- ICMP协议(Internet Control Message Protocol.,因特网控制报文协议);
- ARP协议(Address Resolution Protocol,地址解析协议);
- RARP协议(Reverse Address Resolution Protocol,.逆地址解析协议)。
- 重要的设备:路由器。
4. 网络接口层(Network interface layer)
我们可以把网络接口层看作是数据链路层和物理层的合体。
- 数据链路层(data link layer)通常简称为链路层( 两台主机之间的数据传输,总是在一段一段的链路上传送的)。光纤电缆,交通工具。
- 物理层的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异
5. 总结
应用层协议 :
- HTTP 协议(超文本传输协议,网页浏览常用的协议)
- DHCP 协议(动态主机配置)
- DNS 系统原理(域名系统)
- FTP 协议(文件传输协议)
- Telnet协议(远程登陆协议)
- 电子邮件协议等(SMTP、POP3、IMAP)
- …
传输层协议 :
- TCP 协议
- 报文段结构
- 可靠数据传输
- 流量控制
- 拥塞控制
- UDP 协议
- 报文段结构
- RDT(可靠数据传输协议)
网络层协议 :
- IP 协议(TCP/IP 协议的基础,分为 IPv4 和 IPv6)
- ARP 协议(地址解析协议,用于解析 IP 地址和 MAC 地址之间的映射)
- ICMP 协议(控制报文协议,用于发送控制消息)
- NAT 协议(网络地址转换协议)
- RIP 协议、OSPF 协议、BGP 协议(路由选择协议)
- …
网络接口层 :
- 差错检测技术
- 多路访问协议(信道复用技术)
- CSMA/CD 协议
- MAC 协议
- 以太网技术
- …
为什么网络要分层?
说到分层,我们先从我们平时使用框架开发一个后台程序来说,我们往往会按照每一层做不同的事情的原则将系统分为三层(复杂的系统分层会更多):
- Repository(数据库操作)
- Service(业务操作)
- Controller(前后端数据交互)
复杂的系统需要分层,因为每一层都需要专注于一类事情。网络分层的原因也是一样,每一层只专注于做一类事情。
好了,再来说回:“为什么网络要分层?”。我觉得主要有 3 方面的原因:
- 各层之间相互独立:各层之间相互独立,各层之间不需要关心其他层是如何实现的,只需要知道自己如何调用下层提供好的功能就可以了(可以简单理解为接口调用)。这个和我们对开发时系统进行分层是一个道理。
- 提高了整体灵活性 :每一层都可以使用最适合的技术来实现,你只需要保证你提供的功能以及暴露的接口的规则没有改变就行了。这个和我们平时开发系统的时候要求的高内聚、低耦合的原则也是可以对应上的。
- 大问题化小 : 分层可以将复杂的网络间题分解为许多比较小的、界线比较清晰简单的小问题来处理和解决。这样使得复杂的计算机网络系统变得易于设计,实现和标准化。 这个和我们平时开发的时候,一般会将系统功能分解,然后将复杂的问题分解为容易理解的更小的问题是相对应的,这些较小的问题具有更好的边界(目标和接口)定义。
我想到了计算机世界非常非常有名的一句话,这里分享一下:
计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决,计算机整个体系从上到下都是按照严格的层次结构设计的。
TCP 与 UDP 的区别(传输层协议,重要)
TCP | UDP | |
---|---|---|
是否面向连接 | 是(连接-传送-断开) | 否 |
是否可靠 | 是 | 否 |
是否有状态 | 是(记录是否发送等) | 否不管发出去之后的事情了 |
传输效率 | 较慢 | 较快 |
传输形式 | 字节流 | 数据报文段 |
首部开销 | 20 ~ 60 bytes(大) | 8 bytes |
是否提供广播或多播服务 | 否(只支持点对点通信) | 是 |
什么时候选择 TCP,什么时候选 UDP?
- TCP 用于对传输准确性要求特别高的场景,比如文件传输、发送和接收邮件、远程登录等等。
- UDP 一般用于即时通信,比如: 语音、 视频 、直播等等。这些场景对传输数据的准确性要求不是特别高,比如你看视频即使少个一两帧,实际给人的感觉区别也不大。
使用 TCP 的协议有哪些?使用 UDP 的协议有哪些?
运行于 TCP 协议之上的协议 :
- HTTP 协议 :超文本传输协议(HTTP,HyperText Transfer Protocol)主要是为 Web 浏览器与 Web 服务器之间的通信而设计的。当我们使用浏览器浏览网页的时候,我们网页就是通过 HTTP 请求进行加载的。
- HTTPS 协议 :更安全的超文本传输协议(HTTPS,Hypertext Transfer Protocol Secure),身披 SSL 外衣的 HTTP 协议
- FTP 协议:文件传输协议 FTP(File Transfer Protocol),提供文件传输服务,基于 TCP 实现可靠的传输。使用 FTP 传输文件的好处是可以屏蔽操作系统和文件存储方式。
- SMTP 协议:简单邮件传输协议(SMTP,Simple Mail Transfer Protocol)的缩写,基于 TCP 协议,用来发送电子邮件。注意 ⚠️:接受邮件的协议不是 SMTP 而是 POP3 协议。
- POP3/IMAP 协议: POP3 和 IMAP 两者都是负责邮件接收的协议。
- Telent 协议:远程登陆协议,通过一个终端登陆到其他服务器。被一种称为 SSH 的非常安全的协议所取代。
- SSH 协议 : SSH( Secure Shell)是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH 建立在可靠的传输协议 TCP 之上。
- …
运行于 UDP 协议之上的协议 :
- DHCP 协议:动态主机配置协议,动态配置 IP 地址
- DNS : 域名系统(DNS,Domain Name System)将人类可读的域名 (例如,www.baidu.com) 转换为机器可读的 IP 地址 (例如,220.181.38.148)。 我们可以将其理解为专为互联网设计的电话薄。实际上 DNS 同时支持 UDP 和 TCP 协议。
TCP 三次握手和四次挥手(非常重要)
传输层主要就是建立端到端的连接(如客户端到服务端),两边都可能有多个进程,如客户端同时用谷歌和火狐浏览器浏览B站,那么B站(服务端)除了需要IP地址,还需要端口号才能保证内容不会错发给应用进程。
B站端口号是443(因为是HTTPS协议),电脑会给两个浏览器分配不同的端口号。
IP地址:端口号 -->就叫做套接字socket(是握手之前的核心条件)
1、什么是三次握手?
建立一个 TCP 连接需要“三次握手”,缺一不可:
- 一次握手:客户端发送带有 SYN(SEQ=x) 标志的数据包 -> 服务端,然后客户端进入 SYN_SEND 状态,等待服务端的确认;
- 二次握手:服务端发送带有 SYN+ACK(SEQ=y,ACK=x+1) 标志的数据包 –> 客户端,然后服务端进入 SYN_RECV 状态;
- 三次握手:客户端发送带有 ACK(ACK=y+1) 标志的数据包 –> 服务端,然后客户端和服务端都进入ESTABLISHED 状态,完成 TCP 三次握手。
当建立了 3 次握手之后,客户端和服务端就可以传输数据啦!
2、为什么要三次握手?
三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。
- 第一次握手:Client 什么都不能确认;Server 确认了对方发送正常,自己接收正常
- 第二次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:对方发送正常,自己接收正常
- 第三次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:自己发送、接收正常,对方发送、接收正常
三次握手就能确认双方收发功能都正常,缺一不可。
3、第 2 次握手传回了ACK,为什么还要传回SYN?
服务端传回发送端所发送的 ACK 是为了告诉客户端:“我接收到的信息确实就是你所发送的信号了”,这表明从客户端到服务端的通信是正常的。回传 SYN 则是为了建立并确认从服务端到客户端的通信。
4、三次握手过程中可以携带数据吗?
一旦完成了前两次握手,TCP 协议允许数据在第三次握手时开始传输。
如果第三次握手的 ACK 确认包丢失,但是客户端已经开始发送携带数据的包,那么服务端在收到这个携带数据的包时,如果该包中包含了 ACK 标记,服务端会将其视为有效的第三次握手确认。这样,连接就被认为是建立的,服务端会处理该数据包,并继续正常的数据传输流程。
5、什么是四次挥手
断开一个 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 后依然没有收到回复,就证明服务端已正常关闭,随后客户端也可以关闭连接了。
只要四次挥手没有结束,客户端和服务端就可以继续传输数据!
6、为什么要四次挥手?
TCP 是全双工通信,可以双向传输数据。任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了 TCP 连接。
举个例子:A 和 B 打电话,通话即将结束后。
- 第一次挥手:A 说“我没啥要说的了”
- 第二次挥手:B 回答“我知道了”,但是 B 可能还会有要说的话,A 不能要求 B 跟着自己的节奏结束通话
- 第三次挥手:于是 B 可能又巴拉巴拉说了一通,最后 B 说“我说完了”
- 第四次挥手:A 回答“知道了”,这样通话才算结束。
7、为什么不能把服务器发送的 ACK 和 FIN 合并起来,变成三次挥手?
因为服务端收到客户端断开连接的请求时,可能还有一些数据没有发完,这时先回复 ACK,表示接收到了断开连接的请求。等到数据发完之后再发 FIN,断开服务端到客户端的数据传送。
8、如果第二次挥手时服务器的 ACK 没有送达客户端,会怎样?
客户端没有收到 ACK 确认,会重新发送 FIN 请求。
9、为什么第四次挥手客户端需要等待 2*MSL(报文段最长寿命)时间后才进入 CLOSED 状态?
第四次挥手时,客户端发送给服务端的 ACK 有可能丢失,如果服务端因为某些原因而没有收到 ACK 的话,服务端就会重发 FIN,如果客户端在 2*MSL 的时间内收到了 FIN,就会重新发送 ACK 并再次等待 2MSL,防止 Server 没有收到 ACK 而不断重发 FIN。
TCP 如何保证传输的可靠性?(重要)
-
校验和:TCP会根据首部和数据生成检验和,如果接收方匹配不一致,则认为传输有误。
-
序列号和确认号:序列号:TCP传输时,将每个字节的数据都进行了编号,用来标识数据段的位置。
每次接收方收到数据,都会对传输方进行确认应答,也就是发送ACK报文。
-
超时重传机制:发送方在发送完数据后等待一个时间,如果没有收到ACK报文,则认为数据包丢失或延迟,重新发送数据包,直到收到对方的确认应答(ACK)。
-
连接管理:三次握手和四次挥手。
-
流量控制:接收方将自己缓冲区的大小告诉发送方,发送方会控制发送速率,确保接收方不会丢失数据。
-
拥塞控制:发送方会根据自己所感知到的网络拥塞程度,来限制其能向接收方发送流量的速率。
IP 协议的作用是什么?
IP(Internet Protocol,网际协议) 是 TCP/IP 协议中最重要的协议之一,属于网络层的协议,主要作用是定义数据包的格式、对数据包进行路由和寻址,以便它们可以跨网络传播并到达正确的目的地。
目前 IP 协议主要分为两种,一种是过去的 IPv4,另一种是较新的 IPv6,目前这两种协议都在使用,但后者已经被提议来取代前者。
什么是 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地址的唯一性和全局性保证了网络中的每个设备都可以通过其独特的 IP地址进行标识和寻址。
什么是IP地址过滤?
IP地址过滤(IP Address Filtering) 简单来说就是限制或阻止特定 IP 地址或 IP 地址范围的访问。例如,你有一个图片服务突然被某一个 IP 地址攻击,那我们就可以禁止这个 IP 地址访问图片服务。
IP 地址过滤是一种简单的网络安全措施,实际应用中一般会结合其他网络安全措施,如认证、授权、加密等一起使用。单独使用 IP 地址过滤并不能完全保证网络的安全。
IPv4 和 IPv6 有什么区别?
IPv4 (Internet Protocol version 4)是目前广泛使用的 IP 地址版本,其格式是四组由点分隔的数字,例如:123.89.46.72。IPv4 使用 32 位地址作为其 Internet 地址,这意味着共有约 42 亿( 2 32 2^{32} 232)个可用 IP 地址。
这么少当然不够用啦!为了解决 IP 地址耗尽的问题,最根本的办法是采用具有更大地址空间的新版本 IP 协议——IPv6(Internet Protocol version 6)。IPv6 地址使用更复杂的格式,该格式使用由单或双冒号分隔的一组数字和字母,例如:2001:0db8:85a3:0000:0000:8a2e:0370:7334
。IPv6 使用 128 位互联网地址,这意味着越有 2^128(3 开头的 39 位数字,恐怖如斯) 个可用 IP 地址。
除了更大的地址空间之外,IPv6 的优势还包括:
- 无状态地址自动配置(Stateless Address Autoconfiguration,简称 SLAAC):主机可以直接通过根据接口标识和网络前缀生成全局唯一的 IPv6 地址,而无需依赖 DHCP(Dynamic Host Configuration Protocol)服务器,简化了网络配置和管理。
- NAT(Network Address Translation,网络地址转换) 成为可选项:IPv6 地址资源充足,可以给全球每个设备一个独立的地址。
- 对标头结构进行了改进:IPv6 标头结构相较于 IPv4 更加简化和高效,减少了处理开销,提高了网络性能。
- 可选的扩展头:允许在 IPv6 标头中添加不同的扩展头(Extension Headers),用于实现不同类型的功能和选项。
- ICMPv6(Internet Control Message Protocol for IPv6):IPv6 中的 ICMPv6 相较于 IPv4 中的 ICMP 有了一些改进,如邻居发现、路径 MTU 发现等功能的改进,从而提升了网络的可靠性和性能。
- ……
NAT 的作用是什么?
NAT(Network Address Translation,网络地址转换) 主要用于在不同网络之间转换 IP 地址。它允许将私有 IP 地址(如局域网中)映射为公有 IP 地址(互联网中)或者反向映射,从而实现局域网内的多个设备通过单一公有 IP 地址访问互联网。
NAT 不光可以缓解 IPv4 地址资源短缺的问题,还可以隐藏内部网络的实际拓扑结构,使得外部网络无法直接访问内部网络中的设备,从而提高了内部网络的安全性。
什么是 Mac 地址?
MAC 地址的全称是 媒体访问控制地址(Media Access Control Address)。如果说,互联网中每一个资源都由 IP 地址唯一标识(IP 协议内容),那么一切网络设备都由 MAC 地址唯一标识。
也可以理解为 MAC 地址是身份证号,IP 地址是邮政地址。
ARP 协议解决了什么问题?
ARP 协议,全称 地址解析协议(Address Resolution Protocol),它解决的是网络层地址和链路层地址之间的转换问题。因为一个 IP 数据报在物理上传输的过程中,总是需要知道下一跳(物理上的下一个目的地)该去往何处,但 IP 地址属于逻辑地址,而 MAC 地址才是物理地址,ARP 协议解决了 IP 地址转 MAC 地址的一些问题。
从输入URL 到页面展示到底发生了什么?(非常重要)
类似的问题:打开一个网页,整个过程会使用哪些协议?
图解(图片来源:《图解 HTTP》):
上图有一个错误,请注意,是 OSPF 不是 OPSF。 OSPF(Open Shortest Path First,ospf)开放最短路径优先协议, 是由 Internet 工程任务组开发的路由选择协议
总体来说分为以下几个过程:
-
DNS 解析:把URL地址解析为IP地址(就是110.43.34.184这种),DNS就是个记录着很多URL和对应IP地址的数据库。
-
TCP 连接:正是发送数据之前建立连接,在发送数据之前建立通道,客户端和服务端之闻建立通道就可以以在这个通道里发送数据了(所以需要三次握手:先请求进门、得到回应可以进门、然后进门)
-
发送 HTTP 请求:浏览器发送 HTTP 请求报文给服务器。报文格式如下:
请求行 authority: www.bilibili.com method: GET
请求头部 user-agent: Mozilla/5.0
空行
请求数据 …… -
服务器处理请求并返回 HTTP 报文。响应报文如下:
状态行 你有病 (最常见的404 Not Found)
响应头部 肛肠科:主任医生
空行
响应数据 为你开展手术 -
浏览器解析渲染页面:解析接受到的HTML, CSSm 和JavaScript等文件,解析之后浏览器就能看到内容了
-
连接结束
HTTP是什么?(协议)
归根结底,就是后面那个P(Protocol),也就是协议。
客户端发送请求——请求报文;服务端回应请求——响应报文。
技术蛋老师举例新婚夫妻的例子很生动:
方法和状态码最常见的就是GET和POST,GET是一种获取的方法,POST是一种偏向于传输提交数据的方法。
常见的POST方法用在表单上面,比如,页面上有个表单需要输入账户信息,服务器把从用户那儿来的数据进行处理,再回应客户端。
HTTP 状态码有哪些?
状态码相当多,而且服务端可以自行创建状态码,不过状态码是有规律的。
HTTP 状态码用于描述 HTTP 请求的结果,比如2xx 就代表请求被成功处理。
- 200:被正常处理
- 304:可以使用缓存的内容
- 404:被服务器拒绝了或者找不到请求的资源
- 500:服务器内部发生错误或者故障
HTTP响应首部
一个常见的响应首部:Content-type(内容类型)
发送请求以后,服务器可能会返回各种不同的数据类型(文件,图片或者视频每种类别都会有各自不同的数据类型),有了这个首部显示类型,浏览器就更清楚如何去处理这些不同类型的数据。
HTTP支持传输任意类型的内容。
HTTP 和 HTTPS 有什么区别?(重要)
HTTP请求和响应的报文都是明文的,很不安全,所以加了S —— HTTPS。
HTTPS并不是单独的协议,只不过在HTTP的基础上用 SSL/TLS 进行加密,SSL是TLS的前身
- 端口号 :HTTP 默认是 80,HTTPS 默认是 443。
- URL 前缀 :HTTP 的 URL 前缀是
http://
,HTTPS 的 URL 前缀是https://
。 - 安全性和资源消耗 : HTTP 协议运行在 TCP 之上,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。HTTPS 是运行在 SSL/TLS 之上的 HTTP 协议,SSL/TLS 运行在 TCP 之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。所以说,HTTP 安全性没有 HTTPS 高,但是 HTTPS 比 HTTP 耗费更多服务器资源。
HTTP 1.0 和 HTTP 1.1 有什么区别?
HTTP每条请求报文只能写一个URL,也就是一次只能写一个资源路径,服务器固然可以处理完一个请求就关闭,然后处理下一个(非持久连接),但实际很麻烦,而且每次都要进行TCP连接,所以在 HTTP1.1 中,默认连接为持久连接。
- 连接方式 : HTTP 1.0 为短连接,HTTP 1.1 支持长连接。
- 状态响应码 : HTTP/1.1中新加入了大量的状态码,光是错误响应状态码就新增了24种。比如说,
100 (Continue)
——在请求大资源前的预热请求,206 (Partial Content)
——范围请求的标识码,409 (Conflict)
——请求与当前资源的规定冲突,410 (Gone)
——资源已被永久转移,而且没有任何已知的转发地址。 - 缓存处理 : 在 HTTP1.0 中主要使用 header 里的 If-Modified-Since,Expires 来做为缓存判断的标准,HTTP1.1 则引入了更多的缓存控制策略例如 Entity tag,If-Unmodified-Since, If-Match, If-None-Match 等更多可供选择的缓存头来控制缓存策略。
- 带宽优化及网络连接的使用 :HTTP1.0 中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1 则在请求头引入了 range 头域,它允许只请求资源的某个部分,即返回码是 206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
- Host头处理 : HTTP/1.1在请求头中加入了
Host
字段。
HTTP 是不保存状态的协议, 如何保存用户状态?
HTTP 是一种不保存状态,即无状态(stateless)协议。也就是说 HTTP 协议自身不保存请求和响应之间的通信状态
如何保存用户状态?Session 机制——通过服务端记录用户的状态。
典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了(一般情况下,服务器会在一定时间内保存这个 Session,过了时间限制,就会销毁这个 Session)。
在服务端保存 Session 的方法很多,最常用的就是内存和数据库(比如是使用内存数据库 redis 保存)。既然 Session 存放在服务器端,那么我们如何实现 Session 跟踪呢?大部分情况下,我们都是通过在 Cookie 中附加一个 Session ID 来方式来跟踪。(在首部字段加上Cookie信息)
Cookie 被禁用怎么办?
最常用的就是利用 URL 重写把 Session ID 直接附加在 URL 路径的后面。
URI 和 URL 的区别是什么?
- URI(Uniform Resource Identifier) 是统一资源标志符,可以唯一标识一个资源。
- URL(Uniform Resource Locator) 是统一资源定位符,可以提供该资源的路径。它是一种具体的 URI,即 URL 可以用来标识一个资源,而且还指明了如何 locate 这个资源。
URI 的作用像身份证号一样,URL 的作用更像家庭住址一样。URL 是一种具体的 URI,它不仅唯一标识资源,而且还提供了定位该资源的信息。
GET和POST的区别
语义(主要区别):GET 通常用于获取或查询资源,而 POST 通常用于创建或修改资源。
WebSocket
前情提要:打游戏时,鼠标没有任何点击,就会源源不断跳出怪物进行攻击,而鼠标并没有操作,也就是客户端没有发出请求。所以,怎么样才能在用户不做任何请求的情况下,网页能收到消息并发生变更?
最常见的解决方案是网页前端代码不断定时发HTTP请求到服务器——伪服务器推(仍然是客户端请求,用户无感知)。最常见的应用就是扫码登录(前端以1-2秒的间隔发出请求,问后台用户是否扫码——HTTP定时轮询)。
HTTP定时轮询的问题是①消耗带宽;②1-2秒明显卡顿。——解决方案:长轮询,发起一个请求,在较长时间内等待服务器响应。
这种在用户不感知的情况下将数据推送给浏览器的技术叫做服务器推送技术(comet技术)。
但是这些本质上还是客户端发送请求,无法应对复杂场景(比如游戏)。
什么是 WebSocket?
WebSocket 是一种基于 TCP 连接的全双工通信协议,即客户端和服务器可以同时发送和接收数据(HTTP1.1是半双工,同一时间里只能由一方发送数据)。WebSocket本质上是应用层的协议,用于弥补 HTTP 协议在持久通信能力上的不足。客户端和服务器仅需一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
应用场景:视频弹幕、实时消息推送、实时游戏对战、多用户协同编辑、社交聊天
WebSocket的工作过程是什么样的?
WebSocket 的工作过程可以分为以下几个步骤:
- 客户端向服务器发送一个 HTTP 请求,请求头中包含
Upgrade: websocket
和Sec-WebSocket-Key
等字段,表示要求升级协议为 WebSocket; - 服务器收到这个请求后,会进行升级协议的操作,如果支持 WebSocket,它将回复一个 HTTP 101 状态码(表示协议切换),响应头中包含 ,
Connection: Upgrade
和Sec-WebSocket-Accept: xxx
等字段、表示成功升级到 WebSocket 协议。 - 客户端和服务器之间建立了一个 WebSocket 连接,可以进行双向的数据传输。数据以帧(frames)的形式进行传送,WebSocket 的每条消息可能会被切分成多个数据帧(最小单位)。发送端会将消息切割成多个帧发送给接收端,接收端接收消息帧,并将关联的帧重新组装成完整的消息。
- 客户端或服务器可以主动发送一个关闭帧,表示要断开连接。另一方收到后,也会回复一个关闭帧,然后双方关闭 TCP 连接。
另外,建立 WebSocket 连接之后,通过心跳机制来保持 WebSocket 连接的稳定性和活跃性
WebSocket 和 HTTP 有什么区别?
WebSocket 和 HTTP 两者都是基于 TCP 的应用层协议,都可以在网络中传输数据。WebSocket只有在建立连接时才用到了HTTP,之后就和HTTP没有任何关系。
下面是二者的主要区别:
- WebSocket 是一种双向实时通信协议,而 HTTP 是一种单向通信协议。并且,HTTP 协议下的通信只能由客户端发起,服务器无法主动通知客户端。
- WebSocket 使用 ws:// 或 wss://(使用 SSL/TLS 加密后的协议,类似于 HTTP 和 HTTPS 的关系) 作为协议前缀,HTTP 使用 http:// 或 https:// 作为协议前缀。
- WebSocket 可以支持扩展,用户可以扩展协议,实现部分自定义的子协议,如支持压缩、加密等。
- WebSocket 通信数据格式比较轻量,用于协议控制的数据包头部相对较小,网络开销小,而 HTTP 通信每次都要携带完整的头部,网络开销较大(HTTP/2.0 使用二进制帧进行数据传输,还支持头部压缩,减少了网络开销)。
PING 命令的作用是什么?
PING 命令是一种常用的网络诊断工具,经常用来测试网络中主机之间的连通性和网络延迟。
这里简单举一个例子,我们来 PING 一下百度。
# 发送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
PING 命令的输出结果通常包括以下几部分信息:
- ICMP Echo Request(请求报文)信息:序列号、TTL(Time to Live)值。
- 目标主机的域名或 IP 地址:输出结果的第一行。
- 往返时间(RTT,Round-Trip Time):从发送 ICMP Echo Request(请求报文)到接收到 ICMP Echo Reply(响应报文)的总时间,用来衡量网络连接的延迟。
- 统计结果(Statistics):包括发送的 ICMP 请求数据包数量、接收到的 ICMP 响应数据包数量、丢包率、往返时间(RTT)的最小、平均、最大和标准偏差值。
如果 PING 对应的目标主机无法得到正确的响应,则表明这两个主机之间的连通性存在问题(有些主机或网络管理员可能禁用了对 ICMP 请求的回复,这样也会导致无法得到正确的响应)。如果往返时间(RTT)过高,则表明网络延迟过高。
PING命令的工作原理是什么?
PING 基于网络层的 ICMP(Internet Control Message Protocol,互联网控制报文协议),其主要原理就是通过在网络上发送和接收 ICMP 报文实现的。
ICMP 报文中包含了类型字段,用于标识 ICMP 报文类型。ICMP 报文的类型有很多种,但大致可以分为两类:
- 查询报文类型:向目标主机发送请求并期望得到响应。
- 差错报文类型:向源主机发送错误信息,用于报告网络中的错误情况。
PING 用到的 ICMP Echo Request(类型为 8 ) 和 ICMP Echo Reply(类型为 0) 属于查询报文类型 。
- PING 命令会向目标主机发送 ICMP Echo Request。
- 如果两个主机的连通性正常,目标主机会返回一个对应的 ICMP Echo Reply。
DNS 的作用是什么?
DNS(Domain Name System)域名管理系统,是当用户使用浏览器访问网址之后,使用的第一个重要协议。DNS 要解决的是域名和 IP 地址的映射问题。
在一台电脑上,可能存在浏览器 DNS 缓存,操作系统 DNS 缓存,路由器 DNS 缓存。如果以上缓存都查询不到,那么 DNS 就闪亮登场了。
目前 DNS 的设计采用的是分布式、层次数据库结构,DNS 是应用层协议,它可以在 UDP 或 TCP 协议之上运行,端口为 53 。
DNS 服务器有哪些?根服务器有多少个?
DNS 服务器自底向上可以依次分为以下几个层级(所有 DNS 服务器都属于以下四个类别之一):
-
根 DNS 服务器。根 DNS 服务器提供 TLD 服务器的 IP 地址。目前世界上只有 13 组根服务器,我国境内目前仍没有根服务器。
世界上并不是只有 13 台根服务器。实际上,现在根服务器数量远远超过这个数量。最初确实是为 DNS 根服务器分配了 13 个 IP 地址,每个 IP 地址对应一个不同的根 DNS 服务器。然而,由于互联网的快速发展和增长,这个原始的架构变得不太适应当前的需求。为了提高 DNS 的可靠性、安全性和性能,目前这 13 个 IP 地址中的每一个都有多个服务器,截止到 2023 年底,所有根服务器之和达到了 600 多台,未来还会继续增加。
-
顶级域 DNS 服务器(TLD 服务器)。顶级域是指域名的后缀,如
com
、org
、net
和edu
等。国家也有自己的顶级域,如uk
、fr
和ca
。TLD 服务器提供了权威 DNS 服务器的 IP 地址。 -
权威 DNS 服务器。在因特网上具有公共可访问主机的每个组织机构必须提供公共可访问的 DNS 记录,这些记录将这些主机的名字映射为 IP 地址。
-
本地 DNS 服务器。每个 ISP(互联网服务提供商)都有一个自己的本地 DNS 服务器。当主机发出 DNS 请求时,该请求被发往本地 DNS 服务器,它起着代理的作用,并将该请求转发到 DNS 层次结构中。严格说来,不属于 DNS 层级结构
DNS 劫持了解吗?如何应对?
DNS 劫持是一种网络攻击,它通过修改 DNS 服务器的解析结果,使用户访问的域名指向错误的 IP 地址,从而导致用户无法访问正常的网站,或者被引导到恶意的网站。DNS 劫持有时也被称为 DNS 重定向、DNS 欺骗或 DNS 污染。