25 张图解:键入网址后,到网页显示,其间发生了什么
解答:
- DNS域名解析
- 查询服务器域名对应的 IP 地址。因为委托操作系统发送消息时,必须提供通信对象的 IP 地址
- DNS 中的域名都是用句点来分隔的,比如
www.server.com
,这里的句点代表了不同层次之间的界限。在域名中,越靠右的位置表示其层级越高
- 浏览器得到了IP以后,向服务器发送TCP连接
- TCP 连接的过程,通常称为三次握手,目的是保证双方都有发送和接收的能力。
- 浏览器发送HTTP请求
- 浏览器和服务器建立连接以后,浏览器接着按这个IP地址给服务器发送一个http请求,方式为get,例如访问
www.baidu.com
。其本质是在建立起的TCP连接中,按照HTTP协议标准发送一个索要网页的请求
- 浏览器和服务器建立连接以后,浏览器接着按这个IP地址给服务器发送一个http请求,方式为get,例如访问
- 服务器处理请求
- 服务器(经过物理层→数据链路层→网络层→传输层→应用层)收到浏览器的请求以后,会解析这个请求(读请求头),然后生成一个响应头和具体响应内容。接着服务器会传回来一个响应头和一个响应,响应头告诉了浏览器一些必要的信息
- 浏览器解析渲染页面
- 关闭TCP连接,即TCP的四次挥手
30张图解:HTTP常见面试题
HTTP基本概念
- HTTP 是超文本传输协议,也就是HyperText Transfer Protocol。HTTP 是一个在计算机世界里专门在「两点」之间「传输」文字、图片、音频、视频等「超文本」数据的「约定和规范」,是一个双向协议。
GET 与 POST
- GET 方法的含义是请求从服务器获取资源,这个资源可以是静态的文本、页面、图片视频等
- POST 方法则是相反操作,它向 URI 指定的资源提交数据,数据就放在报文的 body 里
- GET 方法就是安全且幂等的,因为它是「只读」操作,无论操作多少次,服务器上的数据都是安全的,且每次的结果都是相同的。POST 因为是「新增或提交数据」的操作,会修改服务器上的资源,所以是不安全的,且多次提交数据就会创建多个资源,所以不是幂等的
HTTP 与 HTTPS 有哪些区别?
- HTTP 是超文本传输协议,信息是明文传输,存在安全风险的问题。HTTPS 则解决 HTTP 不安全的缺陷,在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输
- HTTPS 实现了信息加密,校验机制,身份证书等功能,使传输更安全
- HTTP 连接建立相对简单, TCP 三次握手之后便可进行 HTTP 的报文传输。而 HTTPS 在 TCP 三次握手之后,还需进行 SSL/TLS 的握手过程,才可进入加密报文传输
- HTTP 的端口号是 80,HTTPS 的端口号是 443
- HTTPS 协议需要向 CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的
HTTPS 是如何解决HTTP的窃听,冒充,篡改等风险的?
- 混合加密的方式实现信息的机密性,解决了窃听的风险
- 将服务器公钥放入到数字证书中,解决了冒充的风险
- 摘要算法的方式来实现完整性,它能够为数据生成独一无二的「指纹」,指纹用于校验数据的完整性,解决了篡改的风险
30张图解:TCP重传、滑动窗口、流量控制、拥塞控制
重传机制
在 TCP 中,当发送端的数据到达接收主机时,接收端主机会返回一个确认应答消息,表示已收到消息
但在错综复杂的网络,并不一定能如上图那么顺利能正常的数据传输,万一数据在传输过程中丢失了呢?
所以 TCP 针对数据包丢失的情况,会用重传机制解决:
1. 超时重传 :当超过指定的时间后,没有收到对方的 ACK 确认应答报文,就会重发该数据
2. 快速重传:不以时间为驱动,而是以数据驱动重传。但是这样的话,发送方不知道哪些数据收到了,哪些没收到
3. SACK( Selective Acknowledgment 选择性确认): 可以将缓存的地图发送给发送方,这样发送方就可以知道哪些数据收到了,哪些数据没收到,知道了这些信息,就可以只重传丢失的数据
4. Duplicate-SACK:使用了 SACK 来告诉「发送方」有哪些数据被重复接收了
滑动窗口
TCP 是每发送一个数据,都要进行一次确认应答。当上一个数据包收到了应答了, 再发送下一个。但这样的话,数据包的往返时间越长,通信的效率就越低。所以用滑动窗口解决该问题。窗口大小就是指无需等待确认应答,而可以继续发送数据的最大值(TCP窗口的最大值为2的16次方,即65535字节)
TCP 头里有一个字段叫 Window,也就是窗口大小。这个字段是接收端告诉发送端自己还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来。
流量控制
- 发送方不能无脑的发数据给接收方,要考虑接收方处理能力。如果对方处理不过来,那么就会导致触发重发机制,浪费资源
- TCP 提供一种机制可以让「发送方」根据「接收方」的实际接收能力控制发送的数据量,这就是所谓的流量控制
拥塞控制
- 在网络出现拥堵时,如果继续发送大量数据包,可能会导致数据包时延、丢失等,这时 TCP 就会重传数据,但是一重传就会导致网络的负担更重,于是会导致更大的延迟以及更多的丢包,这个情况就会进入恶性循环被不断地放大….
- 于是,就有了拥塞控制,控制的目的就是避免「发送方」的数据填满整个网络。 拥塞窗口 cwnd是发送方维护的一个的状态变量,它会根据网络的拥塞程度动态变化的
40张图解:TCP三次握手和四次挥手面试题
TCP 和 UDP 区别
- 传输控制协议 TCP(Transmission Control Protocol)是面向连接的,提供可靠交付,有流量控制,拥塞控制,提供全双工通信,面向字节流(把应用层传下来的报文看成字节流,把字节流组织成大小不等的数据块),每一条 TCP 连接只能是点对点的(一对一)
- 用户数据报协议 UDP(User Datagram Protocol)是无连接的,尽最大可能交付,没有拥塞控制,面向报文(对于应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部),支持一对一、一对多、多对一和多对多的交互通信
- 连接
TCP 是面向连接的传输层协议,传输数据前先要建立连接。
UDP 是不需要连接,即刻传输数据。 - 服务对象
TCP 是一对一的两点服务,即一条连接只有两个端点。
UDP 支持一对一、一对多、多对多的交互通信 - 可靠性
TCP 是可靠交付数据的,数据可以无差错、不丢失、不重复、按需到达。
UDP 是尽最大努力交付,不保证可靠交付数据。 - 拥塞控制、流量控制
TCP 有拥塞控制和流量控制机制,保证数据传输的安全性。
UDP 则没有,即使网络非常拥堵了,也不会影响 UDP 的发送速率。 - 首部开销
TCP 首部长度较长,会有一定的开销,首部在没有使用「选项」字段时是 20 个字节,如果使用了「选项」字段则会变长的。
UDP 首部只有 8 个字节,并且是固定不变的,开销较小。 - 传输方式
TCP 是流式传输,没有边界,但保证顺序和可靠。
UDP 是一个包一个包的发送,是有边界的,但可能会丢包和乱序。 - 分片不同
TCP 的数据大小如果大于 MSS 大小,则会在传输层进行分片,目标主机收到后,也同样在传输层组装 TCP 数据包,如果中途丢失了一个分片,只需要传输丢失的这个分片。
UDP 的数据大小如果大于 MTU 大小,则会在 IP 层进行分片,目标主机收到后,在 IP 层组装完数据,接着再传给传输层,但是如果中途丢了一个分片,则就需要重传所有的数据包,这样传输效率非常差,所以通常 UDP 的报文应该小于 MTU。
TCP 和 UDP 应用场景
- 由于 TCP 是面向连接,能保证数据的可靠性交付,因此经常用于:
- FTP 文件传输
- HTTP / HTTPS
- 由于 UDP 面向无连接,它可以随时发送数据,再加上UDP本身的处理既简单又高效,因此经常用于:
- 包总量较少的通信,如 DNS 、SNMP 等
- 视频、音频等多媒体通信
- 广播通信
TCP的三次握手
第三次握手是可以携带数据的,前两次握手是不可以携带数据的
假设 A 为客户端,B 为服务器端。
- 首先 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 的确认后,连接建立。
TCP为什么是三次握手?
- (因为三次握手才能保证双方具有接收和发送的能力)
- 三次握手才可以阻止重复历史连接的初始化(主要原因)
- 客户端连续发送多次 SYN 建立连接的报文,在网络拥堵情况下:
- 一个「旧 SYN 报文」比「最新的 SYN 」 报文早到达了服务端;那么此时服务端就会回一个 SYN + ACK 报文给客户端;客户端收到后可以根据自身的上下文,判断这是一个历史连接(序列号过期或超时),那么客户端就会发送 RST 报文给服务端,表示中止这一次连接。
- 如果是两次握手连接,就不能判断当前连接是否是历史连接,三次握手则可以在客户端(发送方)准备发送第三次报文时,客户端因有足够的上下文来判断当前连接是否是历史连接:
- 如果是历史连接(序列号过期或超时),则第三次握手发送的报文是 RST 报文,以此中止历史连接;
如果不是历史连接,则第三次发送的报文是 ACK 报文,通信双方就会成功建立连接
- 如果是历史连接(序列号过期或超时),则第三次握手发送的报文是 RST 报文,以此中止历史连接;
- 客户端连续发送多次 SYN 建立连接的报文,在网络拥堵情况下:
- 三次握手才可以同步双方的初始序列号
- 三次握手才可以避免资源浪费
TCP 四次挥手
- A 发送连接释放报文,FIN=1。
- B 收到之后发出确认,此时 TCP 属于半关闭状态,B 能向 A 发送数据但是 A 不能向 B 发送数据。
- 当 B 不再需要连接时,发送连接释放报文,FIN=1。
- A 收到后发出确认,进入 TIME-WAIT 状态,等待 2 MSL(最大报文存活时间)后释放连接。
- B 收到 A 的确认后释放连接。
TCP 为什么是四次挥手?
- 关闭连接时,客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据
- 服务器收到客户端的 FIN 报文时,先回一个 ACK 应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN 报文给客户端来表示同意现在关闭连接
45张图解:IP基础知识全家桶
IP的基本认识
IP 在 TCP/IP 参考模型中处于第三层,也就是网络层。网络层的主要作用是:实现主机与主机之间的通信,也叫点对点(end to end)通信。
MAC 的作用则是实现「直连」的两个设备之间通信,而 IP 则负责在「没有直连」的两个网络之间进行通信传输。
IP:整个旅游行程表就相当于网络层,充当远程定位的功能,行程的开始好比源 IP,行程的终点好比目的 IP 地址。
MAC:在区间内移动相当于数据链路层,充当区间内两个节点传输的功能,区间内的出发点好比源 MAC 地址,目标地点好比目的 MAC 地址
IP 地址的分类
对于 A、B、C 类主要分为两个部分,分别是网络号和主机号
主机号全为 1 指定某个网络下的所有主机,用于广播
主机号全为 0 指定某个网络
无分类地址 CIDR及子网掩码
由于子网网络地址被划分成 2 位,那么子网地址就有 4 个,分别是 00、01、10、11。
公有 IP 地址与私有 IP 地址
IPV4 和IPV6
- IPv4 的地址是 32 位的,大约可以提供 42 亿个地址。但是 IPv6 的地址是 128 位的,这可分配的地址数量是大的惊人,说个段子 IPv6 可以保证地球上的每粒沙子都能被分配到一个 IP 地址
- IPv6 除了有更多的地址之外,还有更好的安全性和扩展性,说简单点就是 IPv6 相比于 IPv4 能带来更好的网络体验。
- IPv6 可自动配置,即使没有 DHCP 服务器也可以实现自动分配IP地址
- IPv6 包头包首部长度采用固定的值 40 字节,去掉了包头校验和,简化了首部结构,减轻了路由器负荷,大大提高了传输的性能。
- IPv6 有应对伪造 IP 地址的网络安全功能以及防止线路窃听的功能,大大提升了安全性
ARP (Address Resolution Protocol,地址解析协议)
网络层实现主机之间的通信,而链路层实现具体每段链路之间的通信。因此在通信过程中,IP 数据报的源地址和目的地址始终不变,而 MAC 地址随着链路的改变而改变。
ARP 实现由 IP 地址得到 MAC 地址。
- 在传输一个 IP 数据报的时候,确定了源 IP 地址和目标 IP 地址后,就会通过主机「路由表」确定 IP 数据包下一跳。然而,网络层的下一层是数据链路层,而链路层实现具体每段链路之间的通信。所以我们还要知道「下一跳」的 MAC 地址。
- 由于主机的路由表中可以找到下一跳的 IP 地址,所以可以通过 ARP 协议,求得下一跳的 MAC 地址。
ARP 是借助 ARP 请求与 ARP 响应两种类型的包确定 MAC 地址的:
- 主机会通过广播发送 ARP 请求,这个包中包含了想要知道的 MAC 地址的主机 IP 地址。
- 当同个链路中的所有设备收到 ARP 请求时,会去拆开 ARP 请求包里的内容,如果 ARP 请求包中的目标 IP 地址与自己的 IP 地址一致,那么这个设备就将自己的 MAC 地址塞入 ARP 响应包返回给主机。