C++面试之计算机网络
1.三次握手,四次挥手
三次握手、四次挥手示意图:
总共有四种状态:主动建立连接、主动断开连接、被动建立连和被动断开连接
两两组合还是 4 种组合:
主动建立连接、主动断开连接会经历的状态:
SYNC_SENT——ESTABLISHED—-FIN_WAIT_1—-FIN_WAIT_2—-TIME_WAIT主动建立连接、被动断开连接会经历的状态:
SYNC_SENT——ESTABLISHED—-CLOSE_WAIT—-LAST_ACK被动建立连接、主动断开连接会经历的状态:
LISTEN—-SYN_RCVD—-ESTABLISHED—-FIN_WAIT_1—-FIN_WAIT_2—-TIME_WAIT- 被动建立连接、被动断开连接会经历的状态:
LISTEN—-SYN_RCVD—-ESTABLISHED—-CLOSE_WAIT—-LAST_ACK
2.滑动窗口机制
由发送方和接收方在三次握手阶段,互相将自己的最大可接收的数据量告诉对方。也就是自己的数据接收缓冲池的大小。这样对方可以根据已发送的数据量来计算是否可以接着发送。
在处理过程中,当接收缓冲池的大小发生变化时,要给对方发送更新窗口大小的通知。
3.拥塞避免机制
拥塞:对资源的需求超过了可用的资源。若网络中许多资源同时供应不足,网络的性能就要明显变坏,整个网络的吞吐量随之负荷的增大而下降。
拥塞控制:防止过多的数据注入到网络中,使得网络中的路由器或链路不致过载。
拥塞控制方法:
- 慢开始 + 拥塞避免;
- 快重传 + 快恢复。
4.浏览器中输入:“www.xxx.com” 之后都发生了什么?请详细阐述。
- 由域名→IP 地址
向DNS服务器发送DNS查询报文解析域名获得IP地址,寻找IP地址的过程依次经过了浏览器缓存、系统缓存、hosts 文件、路由器缓存、 递归搜索根域名服务器。 - 建立 TCP/IP 连接(三次握手具体过程)
- 由浏览器发送一个 HTTP 请求
- 经过路由器的转发,通过服务器的防火墙,该 HTTP 请求到达了服务器
- 服务器处理该 HTTP 请求,返回一个 HTML 文件
- 浏览器解析该 HTML 文件,并且显示在浏览器端
需要注意:
- HTTP 协议是一种基于 TCP/IP 的应用层协议,进行 HTTP 数据请求必须先建立 TCP/IP 连接。可以这样理解:HTTP 是轿车,提供了封装或者显示数据的具体形式;Socket 是发动机,提供了网络通信的能力。
- 两个计算机之间的交流无非是两个端口之间的数据通信 , 具体的数据会以什么样的形式展现是以不同的应用层协议来定义的。
5.常见 HTTP 状态码
- 1xx(临时响应)
- 2xx(成功)
- 3xx(重定向):表示要完成请求需要进一步操作
- 4xx(错误):表示请求可能出错,妨碍了服务器的处理
- 5xx(服务器错误):表示服务器在尝试处理请求时发生内部错误
常见状态码:
- 200(成功)
- 304(未修改):自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容
- 401(未授权):请求要求身份验证
- 403(禁止):服务器拒绝请求
- 404(未找到):服务器找不到请求的网页
6.TCP 和 UDP 的区别:
用户数据包协议 UDP(User Datagram Protocol)是无连接的,尽最大可能交付,没有拥塞控制,面向报文(对于应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部)。
-
传输控制协议 TCP(Transmission Control Protocol) 是面向连接的,提供可靠交付,有流量控制,拥塞控制,提供全双工通信,面向字节流(把应用层传下来的报文看成字节流,把字节流组织成大小不等的数据块)
- TCP通过确认机制,丢包可以重发,保证数据的正确性;UDP不保证正确性,只是单纯的负责发送数据包;
- UDP是面向报文的。发送方的 UDP 对应用程序交下来的报文,在添加首部后就向下交付给 IP 层。既不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小;
- UDP的头部,只有 8 个字节,相对于TCP头部的 20 个字节信息包的额外开销很小。
7.路由器分组转发流程
a、从分组首部提取目的站的IP地址D,得出目的网络地址为N
b、若网络N与此路由器直接相连,则直接将分组交付给目的站D,否则转到c
c、若路由表中有目的地址为D的特定主机路由,则将分组传送给路由表中所指明的下一跳路由器,否则转d
d、若路由表有到达网络N的路由,则将分组传送给路由器表指明的下一跳路由器,否则转e
e、若路由表中有一个默认路由,则将分组传送到默认路由,否则报错。
8.ping的过程
- ping是ICMP的一个重要应用。
- ping同一个网段的主机:查找目的主机的mac地址,然后直接交付。如果没查到mac地址,就进行一次arp请求。
- ping不同网段的主机:发送到网关让其进行转发,同样要发送到网关也得知道网关的mac地址,根据mac地址进行转发。
9.GET和POST
- get和post的请求都能使用额外的参数,但是get的参数是以查询字符串出现在url中,而post的参数存储在实体主体部分。
- get的传参方式相比于post安全性较差,因为get传的参数在url是可见的,可能会泄露私密信息。并且get只支ASCII字符,如果参数为中文则可能会出现乱码,而post支持标准字符集。
-
get的主要目的是获取资源,而post的主要目的是传输实体主体数据。
- head和get一样,但是不返回报文实体主体部分。
- put不带验证机制,存在安全问题。
- delete作用和put相反。
- trace追踪路径
- connect要求用隧道协议连接代理,加密后经过隧道传输。
10.HTTP基础
HTTP协议是无状态的,主要是为了让HTTP协议尽可能简单,使得它能够处理大量事务。HTTP/1.1引入Cookie来保存状态信息。
Cookie信息存在浏览器上。
Session和Cookie区别
- Session是服务器用来跟踪用户的一种手段,每个Session都有一个唯一标识Session ID。
当服务器创建一个Session时,给客户端发送的响应报文就包含了Set-Cookie字段,其中有个名为sid的键值对,这就是Session ID。当客户端收到后就把Cookie保存在浏览器中,并且之后发送的请求报文都包含Session ID。
HTTP就是通过Session和Cookie一起合作实现跟踪用户状态的,Session用于服务器端,Cookie用于客户端。
持久连接
当浏览器访问一个包含多张图片的 HTML 页面时,除了请求访问 HTML 页面资源,还会请求图片资源,如果每进行一次 HTTP 通信就要断开一次 TCP 连接,连接建立和断开的开销会很大。 持久连接 只需要进行一次 TCP 连接就能进行多次 HTTP 通信。HTTP/1.1 开始,所有的连接默认都是持久连接。
持久连接需要使用Connection首部字段进行管理。
- HTTP1.1开始HTTP默认是持久连接,若要关闭需要客户端或服务端提出断开,使用connection:close;而在HTTP1.1之前默认是非持久连接,若要持久连接则需要使用keep-alive。
代理服务器
- 不会改变url,主要目的是缓存、网络访问控制以及访问日志记录。
网关服务器
- 会将HTTP转化为其他协议进行通信,从而请求非HTTP服务器。
隧道:使用SSL等加密手段,为客户端和服务器之间建立一条安全的通信线路。
HTTP安全问题:
- 使用明文进行通信,内容可能会被窃听
- 不验证通信方的身份,通信方的身份可能遭遇伪装
- 无法证明报文的完整性,报文有可能被篡改。
HTTPS并不是新协议,而是HTTP先和SSL通信,再由SSL和TCP通信,提供了加密、认证和完整性保护。
加密:
- HTTPs使用混合加密机制,使用公钥加密用于传输信息的对称秘钥,之后使用对称秘钥进行通信。
- 对称秘钥的缺点:无法安全传输秘钥本身。
- 公钥缺点:更耗时。
认证使用证书。
SSL提供摘要功能来验证完整性。
HTTP/1.1新增内容:
- 默认为持久连接
- 提供了范围请求功能
- 提供了虚拟主机功能
- 多了一些缓存处理字段
- 多了一些状态码