文章目录
- 1. TCP/IP网络模型有哪几层并做简要介绍?
- 2. 键入网址到网页显示,期间发生了什么?
- 3. 介绍一下域名解析的工作流程?
- 4. MAC发送方和接收方如何确认?
- 5. 路由器和交换机的区别?
- 6. Linux系统是如何收发网络包的?
- 7. HTTP是什么?
- 8. HTTP常见的状态码有哪些?
- 9. HTTP 常见字段有哪些?
- 10. GET和POST有什么区别?
- 11. HTTP 缓存有哪些实现方式?
- 12. 什么是强制缓存?
- 13. 什么是协商缓存?
- 14. 使用ETag字段实现的协商缓存的过程是怎样的?
- 15. HTTP/1.1的优点有哪些?
- 16. HTTP/1.1的缺点有哪些?
- 17. HTTP/1.1的性能如何?
- 18. HTTP与HTTPS有哪些区别?
1. TCP/IP网络模型有哪几层并做简要介绍?
TCP/IP网络模型总共分为四层,从上到下分别为应用层、传输层、网络层以及网络接口层。
应用层:只需要专注于为用户提供应用功能,比如HTTP、FTP、DNS、SMTP等;
传输层:为应用层提供网络支持。在传输层有两个传输协议,分别是TCP和UDP。传输层的报文中会携带端口号,因此接收方可以识别出该报文是发给哪个应用。
网络层:网络层主要负责网络包的分片、路由以及转发功能,将数据从一个设备传输到另一个设备。网络层最常使用的是IP协议,如果IP报文大小超过MTU就会对其分片。
网络接口层:在IP头部的前面加上MAC头部,并封装成数据帧发送到网络中,主要为网络层提供链路级别传输的服务,负责在以太网、WIFI这样的底层网络上发送原始数据包,工作在网卡这个层次,使用MAC地址来标识网络上的设备。
2. 键入网址到网页显示,期间发生了什么?
- 首先浏览器对URL进行解析,生成发送给Web服务器的HTTP请求信息。
- 接着需要委托操作系统将请求消息发送给Web服务器。在发送之前,还需要查询服务器域名对应的IP地址,查询IP地址需要访问DNS服务器。DNS服务器分为根DNS服务器、顶级域DNS服务器、权威DNS服务器。
- 接着HTTP请求报文交给TCP传输层进行传输,在TCP传输数据之前,先要进行三次握手建立连接,三次握手的目的是保证双方都有发送和接收的能力。
TCP头部有源端口和目标端口,告知发给哪个应用。序列号解决包乱序的问题。确认号用于确认对方收到的数据,解决丢包的问题。由于TCP是面向连接的,双方要维护连接的状态,有一些状态位,比如SYN是发起一个连接,ACK是回复,RST是重新连接,FIN是结束连接等。头部中还有窗口大小,用于流量控制,表示自己的处理能力。还有校验和、首部长度、紧急指针等。 - TCP 模块在执行连接、收发、断开等各阶段操作时,都需要委托网络层的 IP 模块将数据封装成网络包发送给通信对象。在IP头部里面有源IP地址和目标IP地址以及协议号、TTL、片偏移、首部校验和、首部长度以及总长度等。假设客户端有多个网卡时,就会有多个IP地址,这时就需要根据路由表规则,来判断源IP地址。
- 生成了IP头部之后,接下来网络包还需要在IP头部的前面加上MAC头部。在MAC包头里需要发送方MAC地址和接收方目标MAC地址以及协议类型(IP协议/ARP协议),用于两点的传输。
- 网卡驱动获取到网络包之后,会将其复制到网卡内的缓存区中,接着会在其开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列,最后网卡会将包转为电信号,通过网线发送出去。
- 数据通过交换机和路由器的转发,最终到达服务器,服务器首先会校验数据包的MAC头部、IP头部,从IP头中协议项知道上层为TCP协议,然后查看TCP头部的序列号是不是自己想要的,如果是就放入缓存中然后返回一个ACK,如果不是就丢弃。通过TCP头部的端口号把数据发给监听该端口的HTTP进程。
- 服务器的HTTP进程把响应数据封装在HTTP响应报文里,然后作为发送端,把数据发给客户端。
- 客户端成功收到响应数据后,向服务器发起TCP四次挥手,至此双方的连接就断开了。
3. 介绍一下域名解析的工作流程?
域名解析的工作流程如下:
- 客户端首先会发出一个DNS请求,向本地DNS服务器询问www.server.com的IP是啥。
- 本地域名服务器收到客户端请求后,如果缓存里的表格能找到www.server.com,则直接返回IP地址。如果没有,则本地DNS服务器就会去问它的根域名服务器。
- 根域名服务器收到本地DNS的请求后,会把对应的顶级域服务器的地址发送给本地DNS服务器。
- 本地DNS收到顶级域服务器地址后,接着向顶级域服务器询问www.server.com的IP。
- 顶级域名服务器会把权威域名服务器的地址响应给本地域名服务器。
- 本地DNS服务器访问权威域名服务器,询问服务器域名对应的IP地址。
- 权威DNS服务器查询后将对应的IP地址返回给本地DNS。
- 本地DNS收到服务器的IP地址后,在本地缓存,然后再把IP地址返回给客户端,客户端和目标简历连接。
4. MAC发送方和接收方如何确认?
发送方的MAC地址是在网卡生产时写入到ROM里的,只要将这个值读取出来写入到MAC头部就可以了。
在确认接收方的MAC地址时,首先需要在路由表中查询到接收方的IP地址。然后通过ARP协议找到路由器的MAC地址。
ARP协议会在以太网中以广播的形式发送IP地址,询问接收方对应的MAC地址,接收方收到后,会和自己的IP地址进行比对,接着把自己的MAC地址返回给发送方,由此也得到了接收方的MAC地址。操作系统会把本次查询结果放在ARP缓存中,缓存时间就几分钟。通过arp -a
命令来查看ARP缓存的内容。
5. 路由器和交换机的区别?
因为路由器是基于 IP 设计的,俗称三层网络设备,路由器的各个端口都具有 MAC 地址和 IP 地址;而交换机是基于以太网设计的,俗称二层网络设备,交换机的端口不具有 MAC 地址。
6. Linux系统是如何收发网络包的?
Linux接收网络包的流程:
当网卡接收到一个网络包后,会通过DMA技术将网络包写入到指定的内存地址,也就是写入到Ring Buffer环形缓冲区,接着网卡向CPU发起硬件中断,当CPU收到硬件中断请求后,根据中断表,调用已经注册的硬件中断处理函数。硬件中断处理函数首先暂时屏蔽中断,表示已经知道内存中有数据了,告诉网卡下次再收到数据包直接写内存就可以了,这样可以提高效率,避免CPU不停的被中断。接着,发起软中断,然后恢复刚才屏蔽的中断。当ksoftirqd内核线程收到软中断后,就会来轮询处理数据,从Ring Buffer中获取一个数据帧,用sk_buff表示,从而可以作为一个网络包交给网络协议进行逐层处理。
Linux 发送网络包的流程:
首先,应用程序会调用 Socket 发送数据包的接口,由于这个是系统调用,所以会从用户态陷入到内核态中的 Socket 层,内核会申请一个内核态的 sk_buff 内存,将用户待发送的数据拷贝到 sk_buff 内存,并将其加入到发送缓冲区。接下来,网络协议栈从 Socket 发送缓冲区中取出 sk_buff,并按照 TCP/IP 协议栈从上到下逐层处理。如果使用的是 TCP 传输协议发送数据,那么先拷贝一个新的 sk_buff 副本 ,接着,对 sk_buff 填充 TCP 头。然后交给网络层,在网络层里会做这些工作:选取路由(确认下一跳的 IP)、填充 IP 头、netfilter 过滤、对超过 MTU 大小的数据包进行分片。处理完这些工作后会交给网络接口层处理。网络接口层会通过 ARP 协议获得下一跳的 MAC 地址,然后对 sk_buff 填充帧头和帧尾,接着将 sk_buff 放到网卡的发送队列中。这一些工作准备好后,会触发「软中断」告诉网卡驱动程序,这里有新的网络包需要发送,驱动程序会从发送队列中读取 sk_buff,将这个 sk_buff 挂到 RingBuffer 中,接着将 sk_buff 数据映射到网卡可访问的内存 DMA 区域,最后触发真实的发送。当数据发送完成以后,其实工作并没有结束,因为内存还没有清理。当发送完成的时候,网卡设备会触发一个硬中断来释放内存,主要是释放 sk_buff 内存和清理 RingBuffer 内存。最后,当收到这个 TCP 报文的 ACK 应答时,传输层就会释放原始的 sk_buff 。
7. HTTP是什么?
HTTP是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范。
8. HTTP常见的状态码有哪些?
1xx
类状态码属于提示信息,是协议处理中的一种中间状态。2xx
类状态码表示服务器成功处理了客户端的请求。200 OK
是最常见的成功状态码,表示一切正常。204 No Content
也是常见的成功状态码,其中响应头没有body
数据。206 Partial Content
表示响应返回的body
数据并不是资源的全部,而是其中的一部分,也是服务器处理成功的状态。
3xx
类状态码表示客户端请求的资源发生了变动,需要客户端用新的 URL 重新发送请求获取资源,也就是重定向。301 Moved Permanently
表示永久重定向,需改用新的 URL 再次访问。302 Found
表示临时重定向,说明请求的资源还在,但暂时需要用另一个 URL 来访问。
301
和302
都会在响应头里使用字段Location
,指明后续要跳转的 URL,浏览器会自动重定向新的 URL。304 Not Modified
表示资源未修改,缓存重定向,也就是告诉客户端可以继续使用缓存资源,用于缓存控制。
4xx
类状态码表示客户端发送的报文有误,服务器无法处理,也就是错误码的含义。400 Bad Request
表示客户端请求的报文有错误,但只是个笼统的错误。403 Forbidden
表示服务器禁止访问资源,并不是客户端的请求出错。404 Not Found
表示请求的资源在服务器上不存在或未找到,所以无法提供给客户端。
5xx
类状态码表示客户端请求报文正确,但是服务器处理时内部发生了错误,属于服务器端的错误码。500 Internal Server Error
是个笼统通用的错误码,服务器发生了错误。501 Not Implemented
表示客户端请求的功能还不支持。502 Bad Gateway
通常是服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发生了错误。503 Service Unavailable
表示服务器当前很忙,暂时无法响应客户端。
9. HTTP 常见字段有哪些?
Host
字段:客户端发送请求时,用来指定服务器的域名。Connection
字段:常用于客户端要求服务器使用HTTP 长连接机制,需要指定Connection
首部字段的值为Keep-Alive
。Content-Length
字段:服务器在返回数据时,会有Content-Length
字段,表明本次回应的数据长度。Content-Type
字段:用于服务器回应时,告诉客户端本次传输的数据格式。Accept
字段:客户端请求的时候,可以使用Accept
字段声明自己可以接受的数据格式。Content-Encoding
字段:Content-Encoding
字段说明数据的压缩方法,表示服务器返回的数据使用的压缩格式。Accept-Encoding
字段:客户端在请求时,用Accept-Encoding
字段说明自己可以接受的压缩方法。
10. GET和POST有什么区别?
- GET的语义是从服务器获取指定的资源;POST 的语义是根据报文body对指定的资源做出处理,具体的处理方式视资源类型而不同。
- GET请求的参数位置一般是写在URL中,URL规定只能支持ASCII码,所以GET请求的参数只允许 ASCII 字符 ;POST 请求携带数据的位置一般是写在报文 body 中,body 中的数据可以是任意格式的数据。
- GET请求时,浏览器会对 URL 的长度有限制;而POST请求时,浏览器不会对body大小做限制。
- GET方法是安全、幂等、可被缓存的;POST 不安全,不幂等,(大部分实现)不可缓存。
11. HTTP 缓存有哪些实现方式?
HTTP 缓存有两种实现方式,分别是强制缓存和协商缓存。
12. 什么是强制缓存?
强缓存指的是只要浏览器判断缓存没有过期,则直接使用浏览器的本地缓存,决定是否使用缓存的主动权在于浏览器这边。
强缓存是利用两个 HTTP 响应头部(Response Header)字段Cache-Control
和Expires
实现的,它们都用来表示资源在客户端缓存的有效期。Cache-Control
的优先级高于 Expires
,所以建议使用Cache-Control
来实现强缓存。
强缓存的具体实现流程:
- 当浏览器第一次请求访问服务器资源时,服务器会在返回这个资源的同时,在响应头部加上
Cache-Control
,Cache-Control
中设置了过期时间大小; - 浏览器再次请求访问服务器中的该资源时,会先通过请求资源的时间与
Cache-Control
中设置的过期时间大小,来计算出该资源是否过期,如果没有,则使用该缓存,否则重新请求服务器; - 服务器再次收到请求后,会再次更新响应头部的
Cache-Control
。
13. 什么是协商缓存?
协商缓存就是与服务端协商之后,通过协商结果来判断是否使用本地缓存。
协商缓存可以基于两种头部来实现。第一种是基于请求头部中的 If-Modified-Since
字段与响应头部中的 Last-Modified
字段实现;第二种是基于请求头部中的 If-None-Match
字段与响应头部中的 ETag
字段。
协商缓存这两个字段都需要配合强制缓存中Cache-Control
字段来使用,只有在未能命中强制缓存的时候,才能发起带有协商缓存字段的请求。
14. 使用ETag字段实现的协商缓存的过程是怎样的?
当使用 ETag
字段实现的协商缓存的过程:
- 当浏览器第一次请求访问服务器资源时,服务器会在返回这个资源的同时,在响应头部加上
ETag
唯一标识,这个唯一标识的值是根据当前请求的资源生成的; - 当浏览器再次请求访问服务器中的该资源时,首先会先检查强制缓存是否过期:
- 如果没有过期,则直接使用本地缓存;
- 如果缓存过期了,会在响应头部加上
If-None-Match
字段,该字段的值就是ETag
唯一标识;
- 服务器再次收到请求后,会根据请求中的
If-None-Match
值与当前请求的资源生成的唯一标识进行比较:- 如果值相等,则返回
304 Not Modified
,不会返回资源; - 如果不相等,则返回
200
状态码和返回资源,并在响应头部加上新的ETag
唯一标识;
- 如果值相等,则返回
- 如果浏览器收到
304
的请求响应状态码,则会从本地缓存中加载资源,否则更新资源。
15. HTTP/1.1的优点有哪些?
HTTP1.1最突出的优点是简单、灵活和易于扩展、应用广泛和跨平台。
- 简单:HTTP基本的报文格式是
header + body
,头部信息也是key-value
简单文本格式,易于理解。 - 灵活和易于扩展:协议中的字段允许自定义和扩充,同时由于HTTP工作在应用层,则它的下层可以随意变化,比如HTTPS就是在HTTP与TCP层之间增加了TLS安全传输层,HTTP1.1和HTTP2.0传输协议使用TCP协议,而HTTP3.0传输协议改用了UDP协议。
- 应用广泛和跨平台:台式机和手机的很多APP都采用了HTTP1.1。
16. HTTP/1.1的缺点有哪些?
HTTP协议有优缺点一体的双刃剑,分别为无状态、明文传输,同时还有一大缺点不安全。
- 无状态
- 好处:服务器不需要额外的资源来记录状态信息,能减轻服务器的负担。
- 坏处:由于服务器没有记录HTTP的状态信息,在完成有关联性的操作是会非常麻烦。
对于无状态的问题,比较简单的解决方法是使用Cookie
技术,在客户端第一次请求后,服务器返回的响应报文中携带一个装有客户信息的Cookie
,后续客户端再次请求服务器时,在请求报文中带上Cookie
,服务器检查Cookie
即可。
- 明文传输
- 好处:明文意味着在传输过程中的信息方便阅读,可以直接通过抓包查看报文信息,便于我们的调试工作。
- 坏处:HTTP的所有信息明文传输,很容易被窃取。
- 不安全
- 通信使用明文,因此内容可能会被窃听;
- 不验证通信方的身份,因此有可能遭遇伪装;
- 无法证明报文的完整性, 因此报文有可能被篡改。
17. HTTP/1.1的性能如何?
HTTP协议是基于TCP/IP,并且使用了请求-应答的通信模式,所以性能的关键也在这两点上。
- 长连接
HTTP/1.1 提出了长连接的通信方式好处在于减少了 TCP 连接的重复建立和断开所造成的额外开销,减轻了服务器端的负载。
持久连接的特点是,只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。 - 管道网络传输
管道网络传输可在同一个 TCP 连接里面,客户端可以发起多个请求,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间。但是服务器必须按照接收请求的顺序发送对这些管道化请求的响应。所以,HTTP/1.1 管道解决了请求的队头阻塞,但是没有解决响应的队头阻塞。 - 队头阻塞
当顺序发送的请求序列中的一个请求因为某种原因被阻塞时,在后面排队的所有请求也一同被阻塞了,会导致客户端一直无法得到响应数据,这也就是队头阻塞。
18. HTTP与HTTPS有哪些区别?
HTTP
是超文本传输协议,信息是明文传输,存在安全风险的问题;HTTPS
则解决HTTP
不安全的缺陷,在TCP
和HTTP
网络层之间加入了SSL/TLS
安全协议,使得报文能够加密传输。HTTP
连接建立相对简单,TCP
三次握手之后便可进行HTTP
的报文传输。而HTTPS
在TCP
三次握手之后,还需进行SSL/TLS
的四次握手过程,才可进入加密报文传输。- 两者的默认端口不一样,
HTTP
默认端口号是80
,HTTPS
默认端口号是443
。 HTTPS
协议需要向CA
(证书权威机构)申请数字证书,来保证服务器的身份是可信的。