![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YoBKDlwA-1663169045682)(C:\Users\Administrator.DESKTOP-G8VK4LM\Desktop\markdown\基础科目\计网图片\结构01.png)]](https://1000bd.com/contentImg/2023/11/06/082212174.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v0EiYfOL-1663169045684)(C:\Users\Administrator.DESKTOP-G8VK4LM\Desktop\markdown\常用工具\图片资源\计网协议.png)]](https://1000bd.com/contentImg/2023/11/06/082211876.png)
五层协议中数据链路层和物理层合并为网络接口层。TCP/IP 体系结构不严格遵循 OSI 分层概念,应用层可能会直接使用 IP 层或者网络接口层。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lodezQkB-1663169045686)(C:\Users\Administrator.DESKTOP-G8VK4LM\Desktop\markdown\基础科目\计网图片\结构02.png)]](https://1000bd.com/contentImg/2023/11/06/082212085.png)
带通调制把数字信号转换为模拟信号。
模拟信号是连续的信号,数字信号是离散的信号。
封装成帧:将网络层传下来的分组添加首部和尾部,用于标记帧的开始和结束。链路层传输单位为帧。
透明传输:这个过程透明传输的内容是转义字符,用户察觉不到转义字符的存在。
差错检测:使用循环冗余检验(CRC来检查比特差错。
MAC地址:MAC 地址是链路层地址,长度为 6 字节(48 位),用于唯一标识网络适配器(网卡)。一台主机拥有多少个网络适配器就有多少个 MAC 地址。例如笔记本电脑普遍存在无线网络适配器和有线网络适配器,因此就有两个 MAC 地址。
局域网:是一种典型的广播信道,主要特点是网络为一个单位所拥有,且地理范围和站点数目均有限。主要有以太网、令牌环网、FDDI 和 ATM 等局域网技术
以太网:一种星型拓扑结构局域网 目前以太网使用交换机替代了集线器,交换机是一种链路层设备,它不会发生碰撞,能根据 MAC 地址进行存储转发。
* 实现硬件:交换机,网桥

虚拟局域网:虚拟局域网可以建立与物理位置无关的逻辑组,只有在同一个虚拟局域网中的成员才会收到链路层广播信息。例如下图中 (A1, A2, A3, A4) 属于一个虚拟局域网,A1 发送的广播会被 A2、A3、A4 收到,而其它站点收不到。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aVuMmjtV-1663169045691)(C:\Users\Administrator.DESKTOP-G8VK4LM\Desktop\markdown\基础科目\计网图片\05.png)]](https://1000bd.com/contentImg/2023/11/06/082212176.png)
广播信道:一对多通信,一个节点发送的数据能够被广播信道上所有的节点接收到。所有的节点都在同一个广播信道上发送数据,因此需要有专门的控制方法进行协调,避免发生冲突(冲突也叫碰撞)。
主要有两种控制方法进行协调,一个是使用信道复用技术,一是使用 CSMA/CD 协议。
信道复用技术
频分复用:频分复用的所有主机在相同的时间占用不同的频率带宽资源。
* 时分复用:时分复用的所有主机在不同的时间占用相同的频率带宽资源。

使用频分复用和时分复用进行通信,在通信的过程中主机会一直占用一部分信道资源。因此这两种方式对信道的利用率都不高
统计时分复用:不固定每个用户在时分复用帧中的位置,只要有数据就集中起来组成统计时分复用帧然后发送。

波分复用:光的频分复用。由于光的频率很高,因此习惯上用波长而不是频率来表示所使用的光载波。
码分复用:接收端使用码片S对接收到的数据进行内积运算时,结果为 0 的是其它用户发送的数据,结果为 1 的是用户发送的比特 1,结果为 -1 的是用户发送的比特 0。码分复用需要发送的数据量为原先的 m倍。

CSMA/CD协议(载波监听多点接入 / 碰撞检测)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tnpColxH-1663169045692)(C:\Users\Administrator.DESKTOP-G8VK4LM\Desktop\markdown\基础科目\计网图片\CSMACD.png)]](https://1000bd.com/contentImg/2023/11/06/082212570.png)
使用IP协议可以把异构的物理网络连接起来。
与 IP 协议配套使用的还有三个协议:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yYD9VQiE-1663169045692)(C:\Users\Administrator.DESKTOP-G8VK4LM\Desktop\markdown\基础科目\计网图片\IP格式.png)]](https://1000bd.com/contentImg/2023/11/06/082212690.png)
1.分类
由两部分组成,IP 地址 ::= {< 网络号 >, < 主机号 >}

2.子网划分
在主机号字段中拿一部分作为子网号,把两级 IP 地址划分为三级 IP 地址。IP 地址 ::= {< 网络号 >, < 子网号 >, < 主机号 >}要使用子网,必须配置子网掩码。 并且外部网络看不到子网存在。
3.无分类
无分类编址 CIDR 消除了传统 A 类、B 类和 C 类地址以及划分子网的概念,使用网络前缀和主机号来对 IP 地址进行编码,网络前缀的长度可以根据需要变化。IP 地址 ::= {< 网络前缀号 >, < 主机号 >}
CIDR 的记法上采用在 IP 地址后面加上网络前缀长度的方法,例如 128.14.35.7/20 表示前 20 位为网络前缀。
CIDR 的地址掩码可以继续称为子网掩码,子网掩码首 1 长度为网络前缀的长度。
把通过使用网络前缀来减少路由表项的方式称为路由聚合,也称为 构成超网 。在路由表中的项目由“网络前缀”和“下一跳地址”组成,在查找时可能会得到不止一个匹配结果,应当采用最长前缀匹配来确定应该匹配哪一个。
网络层实现主机之间的通信,而链路层实现具体每段链路之间的通信。因此在通信过程中,IP 数据报的源地址和目的地址始终不变,而 MAC 地址随着链路的改变而改变。ARP 实现由 IP 地址得到 MAC 地址。
每个主机都有一个 ARP 高速缓存,里面有本局域网上的各主机和路由器的 IP 地址到 MAC 地址的映射表。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2oX3aIXp-1663169045693)(C:\Users\Administrator.DESKTOP-G8VK4LM\Desktop\markdown\基础科目\计网图片\ARP协议.png)]](https://1000bd.com/contentImg/2023/11/06/082212287.png)
ICMP 是为了更有效地转发 IP 数据报和提高交付成功的机会。它封装在 IP 数据报中,但是不属于高层协议。
ICMP 报文分为差错报告报文和询问报文。
Ping 是 ICMP 的一个重要应用,主要用来测试两台主机之间的连通性。Ping 的原理是通过向目的主机发送 ICMP Echo 请求报文,目的主机收到之后会发送 Echo 回答报文。Ping 会根据时间和成功响应的次数估算出数据包往返时间以及丢包率。
Traceroute 是 ICMP 的另一个应用,用来跟踪一个分组从源点到终点的路径。
由于 IP 地址的紧缺,一个机构能申请到的 IP 地址数往往远小于本机构所拥有的主机数。并且一个机构并不需要把所有的主机接入到外部的互联网中,机构内的计算机可以使用仅在本机构有效的 IP 地址(专用地址)。
有三个专用地址块:
* 10.0.0.0 ~ 10.255.255.255
* 172.16.0.0 ~ 172.31.255.255
* 192.168.0.0 ~ 192.168.255.255
专用网内部的主机使用本地 IP 地址又想和互联网上的主机通信时,可以使用 NAT 来将本地 IP 转换为全球 IP。使用端口号的 NAT 也叫做网络地址与端口转换 NAPT。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5yFvpVGQ-1663169045694)(C:\Users\Administrator.DESKTOP-G8VK4LM\Desktop\markdown\基础科目\计网图片\NAT.png)]](https://1000bd.com/contentImg/2023/11/06/082212535.png)
路由器从功能上可以划分为:路由选择和分组转发。
分组转发结构由三个部分组成:交换结构、一组输入端口和一组输出端口。

7.1 路由器分组转发流程
* 从数据报的首部提取目的主机的 IP 地址 D,得到目的网络地址 N。
* 若 N 就是与此路由器直接相连的某个网络地址,则进行直接交付;
* 若路由表中有目的地址为 D 的特定主机路由,则把数据报传送给表中所指明的下一跳路由器;
* 若路由表中有到达网络 N 的路由,则把数据报传送给路由表中所指明的下一跳路由器;
* 若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器;
* 报告转发分组出错。
7.2 路由选择协议
路由选择协议都是自适应的,能随着网络通信量和拓扑结构的变化而自适应地进行调整。
可以把路由选择协议划分为两大类:
* 自治系统内部的路由选择:RIP 和 OSPF
* 自治系统间的路由选择:BGP
* 内部网关协议RIP
RIP 是一种基于距离向量的路由选择协议。距离是指跳数,直接相连的路由器跳数为 1。跳数最多为 15,超过 15 表示不可达。RIP 按固定的时间间隔仅和相邻路由器交换自己的路由表,经过若干次交换之后,所有路由器最终会知道到达本自治系统中任何一个网络的最短距离和下一跳路由器地址。
* 内部网关协议OSPF
开放表示 OSPF 不受某一家厂商控制,而是公开发表的;最短路径优先表示使用了 Dijkstra 提出的最短路径算法 SPF。所有路由器都具有全网的拓扑结构图,并且是一致的。相比于 RIP,OSPF 的更新过程**收敛的很快。
* 外部网关协议BGP(边界网关协议)
BGP 只能寻找一条比较好的路由,而 不是最佳路由。每个 AS 都必须配置 BGP 发言人,通过在两个相邻 BGP 发言人之间建立 TCP 连接来交换路由信息。
传输控制协议 TCP(Transmission Control Protocol)是面向连接的,提供可靠交付,有流量控制,拥塞控制,提供全双工通信,面向字节流(把应用层传下来的报文看成字节流,把字节流组织成大小不等的数据块),每一条 TCP 连接只能是点对点的(一对一)。
首先 B 处于 LISTEN(监听)状态,等待客户的连接请求。
A 向 B 发送连接请求报文,SYN=1,ACK=0,选择一个初始的序号 x。
B 收到连接请求报文,如果同意建立连接,则向 A 发送连接确认报文,SYN=1,ACK=1,确认号为 x+1,同时也选择一个初始的序号 y。
A 收到 B 的连接确认报文后,还要向 B 发出确认,确认号为 y+1,序号为 x+1。
B 收到 A 的确认后,连接建立。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VA7Ji7cD-1663169045695)(C:\Users\Administrator.DESKTOP-G8VK4LM\Desktop\markdown\基础科目\计网图片\三次握手.png)]](https://1000bd.com/contentImg/2023/11/06/082212635.png)
A 发送连接释放报文,FIN=1。
B 收到之后发出确认,此时 TCP 属于半关闭状态,B 能向 A 发送数据但是 A 不能向 B 发送数据。
当 B 不再需要连接时,发送连接释放报文FIN=1。
A 收到后发出确认,进入 TIME-WAIT 状态,等待 2 MSL(最大报文存活时间)后释放连接。
B 收到 A 的确认后释放连接。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mnywp6r4-1663169045695)(C:\Users\Administrator.DESKTOP-G8VK4LM\Desktop\markdown\基础科目\计网图片\四次挥手.png)]](https://1000bd.com/contentImg/2023/11/06/082211829.png)
TCP可靠传输
TCP 使用超时重传来实现可靠传输:如果一个已经发送的报文段在超时时间内没有收到确认,那么就重传这个报文段。
TCP滑动窗口
窗口是缓存的一部分,用来暂时存放字节流。发送方和接收方各有一个窗口,接收方通过 TCP 报文段中的窗口字段告诉发送方自己的窗口大小,发送方根据这个值和其它信息设置自己的窗口大小。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t8WtSd5Y-1663169045696)(C:\Users\Administrator.DESKTOP-G8VK4LM\Desktop\markdown\基础科目\计网图片\滑动窗口.png)]](https://1000bd.com/contentImg/2023/11/06/082212725.png)
TCP流量控制
流量控制是为了控制发送方发送速率,保证接收方来得及接收。接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。
TCP拥堵控制
TCP 主要通过四个算法来进行拥塞控制:慢开始、拥塞避免、快重传、快恢复。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qnKOFo3l-1663169045697)(C:\Users\Administrator.DESKTOP-G8VK4LM\Desktop\markdown\基础科目\计网图片\拥塞控制.png)]](https://1000bd.com/contentImg/2023/11/06/082212526.png)
7.1 慢开始与拥塞避免
发送的最初执行慢开始,令 cwnd = 1,发送方只能发送 1 个报文段;当收到确认后,将 cwnd 加倍,因此之后发送方能够发送的报文段数量为:2、4、8 …
注意到慢开始每个轮次都将 cwnd 加倍,这样会让 cwnd 增长速度非常快,从而使得发送方发送的速度增长速度过快,网络拥塞的可能性也就更高。设置一个慢开始门限 ssthresh,当 cwnd >= ssthresh 时,进入拥塞避免,每个轮次只将 cwnd 加 1。如果出现了超时,则令 ssthresh = cwnd / 2,然后重新执行慢开始。

7.2 快重传与快恢复
* 在接收方,要求每次接收到报文段都应该对最后一个已收到的有序报文段进行确认。
* 在发送方,如果收到三个重复确认,那么可以知道下一个报文段丢失,此时执行快重传,立即重传下一个报文段。
在这种情况下,只是丢失个别报文段,而不是网络拥塞。因此执行快恢复,令 ssthresh = cwnd / 2 ,cwnd = ssthresh,注意到此时直接进入拥塞避免。
慢开始和快恢复的快慢指的是 cwnd 的设定值,而不是 cwnd 的增长速率。慢开始 cwnd 设定为 1,而快恢复 cwnd 设定为 ssthresh。

用户数据报协议 UDP(User Datagram Protocol)是无连接的,尽最大可能交付,没有拥塞控制,面向报文(对于应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部),支持一对一、一对多、多对一和多对多的交互通信。
UDP首部:8 个字节,包括源端口、目的端口、长度、检验和。12 字节的伪首部是为了计算检验和临时添加的。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6HRIVWH3-1663169045698)(C:\Users\Administrator.DESKTOP-G8VK4LM\Desktop\markdown\基础科目\计网图片\UDP.png)]](https://1000bd.com/contentImg/2023/11/06/082212703.png)
DNS 是一个分布式数据库,提供了主机名和 IP 地址之间相互转换的服务。这里的分布式数据库是指,每个站点只保留它自己的那部分数据。
域名具有层次结构,从上到下依次为:根域名、顶级域名、二级域名。
DNS 可以使用 UDP 或者 TCP 进行传输,使用的端口号为 53。大多数情况下 DNS 使用 UDP 进行传输,这就要求域名解析器和域名服务器都必须自己处理超时和重传从而保证可靠性。在两种情况下会使用 TCP 进行传输:
FTP 使用 TCP 进行连接,它需要两个连接来传送一个文件:
DHCP (Dynamic Host Configuration Protocol) 提供了即插即用的连网方式,用户不再需要手动配置 IP 地址等信息。
DHCP 配置的内容不仅是 IP 地址,还包括子网掩码、网关 IP 地址。
TELNET 用于登录到远程主机上,并且远程主机上的输出也会返回。TELNET 可以适应许多计算机和操作系统的差异,例如不同操作系统的换行符定义。
一个电子邮件系统由三部分组成:用户代理、邮件服务器以及邮件协议。
邮件协议包含发送协议和读取协议,发送协议常用 SMTP,读取协议常用 POP3 和 IMAP。
5.1 SMTP
SMTP 只能发送 ASCII 码,而互联网邮件扩充 MIME 可以发送二进制文件。MIME 并没有改动或者取代 SMTP,而是增加邮件主体的结构,定义了非 ASCII 码的编码规则。
5.2 POP3
POP3 的特点是只要用户从服务器上读取了邮件,就把该邮件删除。但最新版本的 POP3 可以不删除邮件。
5.3 IMAP
IMAP 协议中客户端和服务器上的邮件保持同步,如果不手动删除邮件,那么服务器上的邮件也不会被删除。IMAP 这种做法可以让用户随时随地去访问服务器上的邮件。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RhcJTHao-1663169045698)(C:\Users\Administrator.DESKTOP-G8VK4LM\Desktop\markdown\基础科目\计网图片\电子邮件协议.png)]](https://1000bd.com/contentImg/2023/11/06/082212668.png)
DHCP 配置主机信息
假设主机最开始没有 IP 地址以及其它信息,那么就需要先使用 DHCP 来获取。
主机生成一个 DHCP 请求报文,并将这个报文放入具有目的端口 67 和源端口 68 的 UDP 报文段中。
该报文段则被放入在一个具有广播 IP 目的地址(255.255.255.255) 和源 IP 地址(0.0.0.0)的 IP 数据报中。
该数据报则被放置在 MAC 帧中,该帧具有目的地址 FF:FF:FF:FF:FF:FF,将广播到与交换机连接的所有设备。
连接在交换机的 DHCP 服务器收到广播帧之后,不断地向上分解得到 IP 数据报、UDP 报文段、DHCP 请求报文,之后生成 DHCP ACK 报文,该报文包含以下信息:IP 地址、DNS 服务器的 IP 地址、默认网关路由器的 IP 地址和子网掩码。该报文被放入 UDP 报文段中,UDP 报文段有被放入 IP 数据报中,最后放入 MAC 帧中。
该帧的目的地址是请求主机的 MAC 地址,因为交换机具有自学习能力,之前主机发送了广播帧之后就记录了 MAC 地址到其转发接口的交换表项,因此现在交换机就可以直接知道应该向哪个接口发送该帧。
主机收到该帧后,不断分解得到 DHCP 报文。之后就配置它的 IP 地址、子网掩码和 DNS 服务器的 IP 地址,并在其 IP 转发表中安装默认网关。
ARP 解析 MAC 地址
主机通过浏览器生成一个 TCP 套接字,套接字向 HTTP 服务器发送 HTTP 请求。为了生成该套接字,主机需要知道网站的域名对应的 IP 地址。
主机生成一个 DNS 查询报文,该报文具有 53 号端口,因为 DNS 服务器的端口号是 53。
该 DNS 查询报文被放入目的地址为 DNS 服务器 IP 地址的 IP 数据报中。
该 IP 数据报被放入一个以太网帧中,该帧将发送到网关路由器。
DHCP 过程只知道网关路由器的 IP 地址,为了获取网关路由器的 MAC 地址,需要使用 ARP 协议。
主机生成一个包含目的地址为网关路由器 IP 地址的 ARP 查询报文,将该 ARP 查询报文放入一个具有广播目的地址(FF:FF:FF:FF:FF:FF)的以太网帧中,并向交换机发送该以太网帧,交换机将该帧转发给所有的连接设备,包括网关路由器。
网关路由器接收到该帧后,不断向上分解得到 ARP 报文,发现其中的 IP 地址与其接口的 IP 地址匹配,因此就发送一个 ARP 回答报文,包含了它的 MAC 地址,发回给主机。
DNS 解析域名
知道了网关路由器的 MAC 地址之后,就可以继续 DNS 的解析过程了。
网关路由器接收到包含 DNS 查询报文的以太网帧后,抽取出 IP 数据报,并根据转发表决定该 IP 数据报应该转发的路由器。
因为路由器具有内部网关协议(RIP、OSPF)和外部网关协议(BGP)这两种路由选择协议,因此路由表中已经配置了网关路由器到达 DNS 服务器的路由表项。
到达 DNS 服务器之后,DNS 服务器抽取出 DNS 查询报文,并在 DNS 数据库中查找待解析的域名。
找到 DNS 记录之后,发送 DNS 回答报文,将该回答报文放入 UDP 报文段中,然后放入 IP 数据报中,通过路由器反向转发回网关路由器,并经过以太网交换机到达主机。
HTTP 请求页面
有了 HTTP 服务器的 IP 地址之后,主机就能够生成 TCP 套接字,该套接字将用于向 Web 服务器发送 HTTP GET 报文。
在生成 TCP 套接字之前,必须先与 HTTP 服务器进行三次握手来建立连接。生成一个具有目的端口 80 的 TCP SYN 报文段,并向 HTTP 服务器发送该报文段。
HTTP 服务器收到该报文段之后,生成 TCP SYN ACK 报文段,发回给主机。
连接建立之后,浏览器生成 HTTP GET 报文,并交付给 HTTP 服务器。
HTTP 服务器从 TCP 套接字读取 HTTP GET 报文,生成一个 HTTP 响应报文,将 Web 页面内容放入报文主体中,发回给主机。
浏览器收到 HTTP 响应报文后,抽取出 Web 页面内容,之后进行渲染,显示 Web 页面。
链接:https://leetcode.cn/leetbook/read/tech-interview-cookbook/ooarfv/
7.1 请求报文
* 第一行是包含了请求方法、URL、协议版本;
* 接下来的多行都是请求首部 Header,每个首部都有一个首部名称,以及对应的值。
* 一个空行用来分隔首部和内容主体 Body
* 最后是请求的内容主体
7.2 响应报文
* 第一行包含协议版本、状态码以及描述,最常见的是 200 OK 表示请求成功了
* 接下来多行也是首部内容
* 一个空行分隔首部和内容主体
* 最后是响应的内容主体
7.3 URL(统一资源定位符)
URL是URI的子集,URL 在 URI 的基础上增加了定位能力。URI 除了包含 URL,还包含 URN(Uniform Resource Name,统一资源名称),它只是用来定义一个资源的名称,并不具备定位该资源的能力。

7.4 HTTP 方法
* GET:获取资源
* HEAD:获取报文首部,但不返回报文主体部分。
* POST:传输实体主体
* PUT:上传文件
* PATCH:对资源进行部分修改
* DELECT:删除文件,不带验证机制
* OPTIONS:查询指定的URL支持方法。
* COMMECT:使用 SSL(Secure Sockets Layer,安全套接层)和 TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输。
* TRACE:追踪路径,服务器会将通信路径返回给客户端。容易受到XST攻击。
7.5 HTTP状态码
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZdQ72Lq1-1663169045699)(C:\Users\Administrator.DESKTOP-G8VK4LM\Desktop\markdown\基础科目\计网图片\HTTP状态码.png)]](https://1000bd.com/contentImg/2023/11/06/082211960.png)
204 No Content :请求已经成功处理,但是返回的响应报文不包含实体的主体部分。一般在只需要从客户端往服务器发送信息,而不需要返回数据时使用。
206 Partial Content :表示客户端进行了范围请求,响应报文包含由 Content-Range 指定范围的实体内容。
301 Moved Permanently :永久性重定向
302 Found :临时性重定向
303 See Other :和 302 有着相同的功能,但是 303 明确要求客户端应该采用 GET 方法获取资源。
注:虽然 HTTP 协议规定 301、302 状态下重定向时不允许把 POST 方法改成 GET 方法,但是大多数浏览器都会在 301、302 和 303 状态下的重定向把 POST 方法改成 GET 方法。
304 Not Modified :如果请求报文首部包含一些条件,例如:If-Match,If-Modified-Since,If-None-Match,If-Range,If-Unmodified-Since,如果不满足条件,则服务器会返回 304 状态码。
307 Temporary Redirect :临时重定向,与 302 的含义类似,但是 307 要求浏览器不会把重定向请求的 POST 方法改成 GET 方法。
500 Internal Server Error :服务器正在执行请求时发生错误。
503 Service Unavailable :服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。
504错误代表网关超时 (Gateway timeout),是指服务器作为网关或代理,但是没有及时从上游服务器收到请求。
7.6 HTTP首部
有 4 种类型的首部字段:通用首部字段、请求首部字段、响应首部字段和实体首部字段。
8.1 用途:会话状态管理;个性化设置;浏览器行为跟踪
8.2 创建过程:服务器发送的响应报文包含 Set-Cookie 首部字段,客户端得到响应报文后把 Cookie 内容保存到浏览器中。 客户端 之后对同一个服务器发送请求时,会从浏览器中取出 Cookie 信息并通过 Cookie 请求首部字段发送给服务器。
8.3 分类:会话期Cookie仅在会话期有效
持久性Cookie在指定时间内长久有效
8.4 作用域 :Domain 标识指定了哪些主机可以接受 Cookie。如果不指定,默认为当前文档的主机(不包含子域名)。如果指定了 Domain,则一般包含子域名。 Path 标识指定了主机下的哪些路径可以接受 Cookie(该 URL 路径必须存在于请求 URL 中)
8.5 Secure :标记为 Secure 的 Cookie 只能通过被 HTTPS 协议加密过的请求发送给服务端。但即便设置了 Secure 标记,敏感信息也不应该通过 Cookie 传输,因为 Cookie 有其固有的不安全性,Secure 标记也无法提供确实的安全保障。
8.6 Session :除了可以将用户信息通过 Cookie 存储在用户浏览器中,也可以利用 Session 存储在服务器端,存储在服务器端的信息更加安全。
Session 可以存储在服务器上的文件、数据库或者内存中。也可以将 Session 存储在 Redis 这种内存型数据库中,效率会更高。
应该注意 Session ID 的安全性问题,不能让它被恶意攻击者轻易获取,那么就不能产生一个容易被猜到的 Session ID 值。此外,还需要经常重新生成 Session ID。在对安全性要求极高的场景下,例如转账等操作,除了使用 Session 管理用户状态之外,还需要对用户进行重新验证,比如重新输入密码,或者使用短信验证码等方式。
8.7 浏览器禁用Cookie :此时无法使用Cookie保存用户信息,只能使用Session,使用URL重写技术,将Session ID 作为 URL 的参数进行传递。
8.8 对于不重要权重低的信息使用Cookie保存即可;在数据复杂度高的情况下,适合用Session,大型网站中,应该Cookie和Session相结合,全部使用Session,服务器开销会很大。
用途
实现方式
缓存控制
禁止进行缓存
no-store 指令规定不能对请求或响应的任何一部分进行缓存。
强制确认缓存
no-cache 指令规定缓存服务器需要先向源服务器验证缓存资源的有效性,只有当缓存资源有效时才能使用该缓存对客户端的请求进行响应。
私有缓存和公共缓存
private 指令规定了将资源作为私有缓存,只能被单独用户使用,一般存储在用户浏览器中。
public 指令规定了将资源作为公共缓存,可以被多个用户使用,一般存储在代理服务器中。
缓存过期机制
max-age 指令出现在请求报文,并且缓存资源的缓存时间小于该指令指定的时间,那么就能接受该缓存。
max-age 指令出现在响应报文,表示缓存资源在缓存服务器中保存的时间。
Expires 首部字段也可以用于告知缓存服务器该资源什么时候会过期。
在 HTTP/1.1 中,会优先处理 max-age 指令;
在 HTTP/1.0 中,max-age 指令会被忽略掉。
缓存验证
概念
HTTPS 并不是新协议,而是让 HTTP 先和 SSL(Secure Sockets Layer)通信,再由 SSL 和 TCP 通信,也就是说 HTTPS 使用了隧道进行通信。
通过使用 SSL,HTTPS 具有了加密(防窃听)、认证(防伪装)和完整性保护(防篡改)。
加密方法
HTTPS 采用混合的加密机制:
使用非对称密钥加密方式,传输对称密钥加密方式所需要的 Secret Key,从而保证安全性;
获取到 Secret Key 后,再使用对称密钥加密方式进行通信,从而保证效率。
认证
通过使用 证书 来对通信方进行认证。
数字证书认证机构(CA,Certificate Authority)是客户端与服务器双方都可信赖的第三方机构。
服务器的运营人员向 CA 提出公开密钥的申请,CA 在判明提出申请者的身份之后,会对已申请的公开密钥做数字签名,然后分配这个已签名的公开密钥,并将该公开密钥放入公开密钥证书后绑定在一起。
进行 HTTPS 通信时,服务器会把证书发送给客户端。客户端取得其中的公开密钥之后,先使用数字签名进行验证,如果验证通过,就可以开始通信了。
完整性保护
SSL 提供报文摘要功能来进行完整性保护。
HTTP 也提供了 MD5 报文摘要功能,但不是安全的。例如报文内容被篡改之后,同时重新计算 MD5 的值,通信接收方是无法意识到发生了篡改。
HTTPS 的报文摘要功能之所以安全,是因为它结合了加密和认证这两个操作。试想一下,加密之后的报文,遭到篡改之后,也很难重新计算报文摘要,因为无法轻易获取明文。
缺点
HTTP和HTTPS的区别
HTTP是超文本传输协议,信息是明文传输;HTTPS则是具有安全性的ssl加密传输协议。
HTTP和HTTPS用的端口不一样,HTTP端口是80,HTTPS是443。
HTTPS协议需要到CA机构申请证书,一般需要一定的费用。
HTTP运行在TCP协议之上;HTTPS运行在SSL协议之上,SSL运行在TCP协议之上。
作用
GET 用于获取资源,而 POST 用于传输实体主体。
参数
GET 和 POST 的请求都能使用额外的参数,但是 GET 的参数是以查询字符串出现在 URL 中,而 POST 的参数存储在实体主体中。不能因为 POST 参数存储在实体主体中就认为它的安全性更高,因为照样可以通过一些抓包工具(Fiddler)查看。
因为 URL 只支持 ASCII 码,因此 GET 的参数中如果存在中文等字符就需要先进行编码。例如 中文 会转换为 %E4%B8%AD%E6%96%87,而空格会转换为 %20。POST 参数支持标准字符集。
安全
安全的 HTTP 方法不会改变服务器状态,也就是说它只是可读的。
GET 方法是安全的,而 POST 却不是,因为 POST 的目的是传送实体主体内容,这个内容可能是用户上传的表单数据,上传成功之后,服务器可能把这个数据存储到数据库中,因此状态也就发生了改变。
安全的方法除了 GET 之外还有:HEAD、OPTIONS。
不安全的方法除了 POST 之外还有 PUT、DELETE。
幂等性
幂等的 HTTP 方法,同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的。换句话说就是,幂等方法不应该具有副作用(统计用途除外)。
所有的安全方法也都是幂等的。
在正确实现的条件下,GET,HEAD,PUT 和 DELETE 等方法都是幂等的,而 POST 方法不是。
可缓存
如果要对响应进行缓存,需要满足以下条件:
请求报文的 HTTP 方法本身是可缓存的,包括 GET 和 HEAD,但是 PUT 和 DELETE 不可缓存,POST 在多数情况下不可缓存的。
响应报文的状态码是可缓存的,包括:200, 203, 204, 206, 300, 301, 404, 405, 410, 414, and 501。
响应报文的 Cache-Control 首部字段没有指定不进行缓存。
XMLHttpRequest
为了阐述 POST 和 GET 的另一个区别,需要先了解 XMLHttpRequest:
XMLHttpRequest 是一个 API,它为客户端提供了在客户端和服务器之间传输数据的功能。它提供了一个通过 URL 来获取数据的简单方式,并且不会使整个页面刷新。这使得网页只更新一部分页面而不会打扰到用户。XMLHttpRequest 在 AJAX 中被大量使用。
在使用 XMLHttpRequest 的 POST 方法时,浏览器会先发送 Header 再发送 Data。但并不是所有浏览器会这么做,例如火狐就不会。
而 GET 方法 Header 和 Data 会一起发送。
如果单纯问,get和post哪个更安全,怎么回答呢?
与 POST 相比,GET 的数据安全性较差,因为所发送的数据是 URL 的一部分。(在发送密码或其他敏感信息时绝不要使用 GET !)
POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中
客户端需要使用多个连接才能实现并发和缩短延迟;
不会压缩请求和响应首部,从而导致不必要的网络流量;
不支持有效的资源优先级,致使底层 TCP 连接的利用率低下。
二进制分帧层
HTTP/2.0 将报文分成 HEADERS 帧和 DATA 帧,它们都是二进制格式的。
在通信过程中,只会有一个 TCP 连接存在,它承载了任意数量的双向数据流(Stream)。
一个数据流(Stream)都有一个唯一标识符和可选的优先级信息,用于承载双向信息。
消息(Message)是与逻辑请求或响应对应的完整的一系列帧。
帧(Frame)是最小的通信单位,来自不同数据流的帧可以交错发送,然后再根据每个帧头的数据流标识符重新组装。
服务端推送
HTTP/2.0 在客户端请求一个资源时,会把相关的资源一起发送给客户端,客户端就不需要再次发起请求了。例如客户端请求 page.html 页面,服务端就把 script.js 和 style.css 等与之相关的资源一起发给客户端。
首部压缩
HTTP/1.1 的首部带有大量信息,而且每次都要重复发送。
HTTP/2.0 要求客户端和服务器同时维护和更新一个包含之前见过的首部字段表,从而避免了重复传输。
不仅如此,HTTP/2.0 也使用 Huffman 编码对首部字段进行压缩。
长连接只需要建立一次 TCP 连接就能进行多次 HTTP 通信。
从 HTTP/1.1 开始默认是长连接的,如果要断开连接,需要由客户端或者服务器端提出断开,使用 Connection : close;
在 HTTP/1.1 之前默认是短连接的,如果需要使用长连接,则使用 Connection : Keep-Alive。
流水线是在同一条长连接上连续发出请求,而不用等待响应返回,这样可以减少延迟。
内容编码将实体主体进行压缩,从而减少传输的数据量。
常用的内容编码有:gzip、compress、deflate、identity。
浏览器发送 Accept-Encoding 首部,其中包含有它所支持的压缩算法,以及各自的优先级。服务器则从中选择一种,使用该算法对响应的消息主体进行压缩,并且发送 Content-Encoding 首部来告知浏览器它选择了哪一种算法。由于该内容协商过程是基于编码类型来选择资源的展现形式的,响应报文的 Vary 首部字段至少要包含 Content-Encoding。
如果网络出现中断,服务器只发送了一部分数据,范围请求可以使得客户端只请求服务器未发送的那部分数据,从而避免服务器重新发送所有数据。
Range
在请求报文中添加 Range 首部字段指定请求的范围。
请求成功的话服务器返回的响应包含 206 Partial Content 状态码。
Accept-Ranges
响应首部字段 Accept-Ranges 用于告知客户端是否能处理范围请求,可以处理使用 bytes,否则使用 none。
响应状态码
在请求成功的情况下,服务器会返回 206 Partial Content 状态码。
在请求的范围越界的情况下,服务器会返回 416 Requested Range Not Satisfiable 状态码。
在不支持范围请求的情况下,服务器会返回 200 OK 状态码。
分块传输协议
Chunked Transfer Encoding,可以把数据分割成多块,让浏览器逐步显示页面。
多部分对象集合
一份报文主体内可含有多种类型的实体同时发送,每个部分之间用 boundary 字段定义的分隔符进行分隔,每个部分都可以有首部字段。
代理
代理服务器接受客户端的请求,并且转发给其它服务器。
使用代理的主要目的是:
代理服务器分为正向代理和反向代理两种:
网关
与代理服务器不同的是,网关服务器会将 HTTP 转化为其它协议进行通信,从而请求其它非 HTTP 服务器的服务。
隧道
使用 SSL 等加密手段,在客户端和服务器之间建立一条安全的通信线路。
视频直播有多种协议,使用rtmp协议的就是rtmp直播。直播流就是视频流,即传递的视频数据。常见的协议有RTMP、RTSP、HTTP协议,这三个协议都属于互联网TCP/IP五层体系结构中应用层的协议。理论上这三种都可以用来做视频直播或点播。但通常来说,直播一般用RTMP、RTSP,而点播用
HTTP。下面分别介绍下三者的特点。
提高处理socket连接的性能,请遵循以下技巧:
**应用层数据(报文)向外发送时,数据是由最上面的应用层向下经过一层层封装后发送给物理层;而接收数据时,数据是由物理层向上经过一层层解封后发给应用层。**数据的封装和解封过程如下:


UDP会不会产生粘包问题呢?
TCP为了保证可靠传输并减少额外的开销(每次发包都要验证),采用了基于流的传输,基于流的传输不认为消息是一条一条的,是无保护消息边界的(保护消息边界:指传输协议把数据当做一条独立的消息在网上传输,接收端一次只能接受一条独立的消息)。UDP则是面向消息传输的,是有保护消息边界的,接收方一次只接受一条独立的信息,所以不存在粘包问题。
参考回答
参考回答
参考回答
HTTP2.0中TCP阻塞了有如下两种方法可以解决:
(1)并发TCP连接(浏览器一个域名采用6-8个TCP连接,并发HTTP请求)
(2)域名分片(多个域名,可以建立更多的TCP连接,从而提高HTTP请求的并发)
答案解析
参考回答
参考回答
数据包会因为IP层所规划的路由链路的不同导致数据包的接收顺序与发送顺序会有所不同。另外因为TCP是一种全双工的协议,乱序可能发生在正向链路,也可能发生在反向链路,这两种不同的情况给TCP带来的影响也会略有差异。
参考回答
IPv4和IPv6是是目前使用的两种Internet协议版本,IPv4和IPv6协议之间存在各种差异,包括它们的功能,但关键的一点是它生成的地址(地址空间)的数量的区别。
参考回答
常见的对称加密算法有:DES、3DES、Blowfish、IDEA、RC4、RC5、RC6和AES ;
常见的非对称加密算法有:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用);
常见的Hash算法有:MD2、MD4、MD5、HAVAL、SHA;
HTTP0.9
最简单的只有请求行 GET index.html
HTTP1.0
(1)增加请求头、响应头,让请求和相应都更清晰
(2)增加状态码,让响应更清晰
(3)增加缓存功能,已请求过的内容再次请求时就可直接使用缓存
a. accept 解决文件格式问题,是json还是html,浏览器根据不同文件格式来解析文件;
b. accept-charset 解决文件编码问题,告知浏览器如何将字符流解析成字节流;
c. accept-encoding 解决大文件压缩问题,浏览器采用指定的解压方式来解压;
d. accept-language 解决国际化问题,不同国家请求不同语言的文件。
HTTP1.1
(1)持久连接,多个http请求使用同一个tcp连接,减少了tcp建立连接时的开销
(2)客户端和服务器之间可以建立多个tcp连接以解决队头阻塞的问题
(3)响应体可以分块传输,无需一次传输全部内容
(4)响应头增加content-length字段满足动态内容无法一次计算出长度和无法一次传输完成的问题
(5)增加了安全机制和cookie机制
HTTP2.0
多路复用,客户端和服务器之间只建立一条tcp,每个http请求被切分成多帧,多个http的帧混合在一起在一个tcp连接上传送。
HTTP3.0
不再使用tcp协议,因为tcp依然是顺序发送,顺序接收的,依然有队头堵塞问题,干掉tcp才能解决队头堵塞问题。google的QUIC就使用了udp协议。
参考回答
301和302的区别在于,301重定向是永久的重定向,搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址。302重定向是暂时的重定向,搜索引擎会抓取新的内容而保存旧的网址。由于效劳器前往302代码,搜索引擎以为新的网址只是暂时的。
302和304有什么区别?
参考回答
302和304是网页请求的两个不同的响应状态码。302 (临时移动)表示 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。 304 (未修改)表示 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。
(1)请求次数:重定向是浏览器向服务器发送一个请求并收到响应后再次向一个新地址发出请求,转发是服务器收到请求后为了完成响应跳转到一个新的地址;重定向至少请求两次,转发请求一次;
(2)地址栏不同:重定向地址栏会发生变化,转发地址栏不会发生变化;
(3)是否共享数据:重定向两次请求不共享数据,转发一次请求共享数据(在request级别使用信息共享,使用重定向必然出错);
(4)跳转限制:重定向可以跳转到任意URL,转发只能跳转本站点资源;
(5)发生行为不同:重定向是客户端行为,转发是服务器端行为
参考回答
参考回答
参考回答
sockets(套接字)编程有三种:流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW);基于TCP的socket编程是采用的流式套接字。
参考回答