计算机网络(一):基础篇

文章目录

      • 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. 键入网址到网页显示,期间发生了什么?

  1. 首先浏览器对URL进行解析,生成发送给Web服务器的HTTP请求信息。
  2. 接着需要委托操作系统将请求消息发送给Web服务器。在发送之前,还需要查询服务器域名对应的IP地址,查询IP地址需要访问DNS服务器。DNS服务器分为根DNS服务器、顶级域DNS服务器、权威DNS服务器。
  3. 接着HTTP请求报文交给TCP传输层进行传输,在TCP传输数据之前,先要进行三次握手建立连接,三次握手的目的是保证双方都有发送和接收的能力。
    TCP头部有源端口和目标端口,告知发给哪个应用。序列号解决包乱序的问题。确认号用于确认对方收到的数据,解决丢包的问题。由于TCP是面向连接的,双方要维护连接的状态,有一些状态位,比如SYN是发起一个连接,ACK是回复,RST是重新连接,FIN是结束连接等。头部中还有窗口大小,用于流量控制,表示自己的处理能力。还有校验和首部长度紧急指针等。
  4. TCP 模块在执行连接、收发、断开等各阶段操作时,都需要委托网络层的 IP 模块将数据封装成网络包发送给通信对象。在IP头部里面有源IP地址和目标IP地址以及协议号、TTL、片偏移、首部校验和、首部长度以及总长度等。假设客户端有多个网卡时,就会有多个IP地址,这时就需要根据路由表规则,来判断源IP地址。
  5. 生成了IP头部之后,接下来网络包还需要在IP头部的前面加上MAC头部。在MAC包头里需要发送方MAC地址和接收方目标MAC地址以及协议类型(IP协议/ARP协议),用于两点的传输。
  6. 网卡驱动获取到网络包之后,会将其复制到网卡内的缓存区中,接着会在其开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列,最后网卡会将包转为电信号,通过网线发送出去。
  7. 数据通过交换机和路由器的转发,最终到达服务器,服务器首先会校验数据包的MAC头部、IP头部,从IP头中协议项知道上层为TCP协议,然后查看TCP头部的序列号是不是自己想要的,如果是就放入缓存中然后返回一个ACK,如果不是就丢弃。通过TCP头部的端口号把数据发给监听该端口的HTTP进程。
  8. 服务器的HTTP进程把响应数据封装在HTTP响应报文里,然后作为发送端,把数据发给客户端。
  9. 客户端成功收到响应数据后,向服务器发起TCP四次挥手,至此双方的连接就断开了。

3. 介绍一下域名解析的工作流程?

域名解析的工作流程如下:

  1. 客户端首先会发出一个DNS请求,向本地DNS服务器询问www.server.com的IP是啥。
  2. 本地域名服务器收到客户端请求后,如果缓存里的表格能找到www.server.com,则直接返回IP地址。如果没有,则本地DNS服务器就会去问它的根域名服务器。
  3. 根域名服务器收到本地DNS的请求后,会把对应的顶级域服务器的地址发送给本地DNS服务器。
  4. 本地DNS收到顶级域服务器地址后,接着向顶级域服务器询问www.server.com的IP。
  5. 顶级域名服务器会把权威域名服务器的地址响应给本地域名服务器。
  6. 本地DNS服务器访问权威域名服务器,询问服务器域名对应的IP地址。
  7. 权威DNS服务器查询后将对应的IP地址返回给本地DNS。
  8. 本地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 来访问。
      301302 都会在响应头里使用字段 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-ControlExpires实现的,它们都用来表示资源在客户端缓存的有效期。Cache-Control 的优先级高于 Expires,所以建议使用Cache-Control来实现强缓存。
强缓存的具体实现流程:

  • 当浏览器第一次请求访问服务器资源时,服务器会在返回这个资源的同时,在响应头部加上 Cache-ControlCache-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最突出的优点是简单灵活和易于扩展应用广泛和跨平台

  1. 简单:HTTP基本的报文格式是header + body,头部信息也是key-value简单文本格式,易于理解。
  2. 灵活和易于扩展:协议中的字段允许自定义和扩充,同时由于HTTP工作在应用层,则它的下层可以随意变化,比如HTTPS就是在HTTP与TCP层之间增加了TLS安全传输层,HTTP1.1和HTTP2.0传输协议使用TCP协议,而HTTP3.0传输协议改用了UDP协议。
  3. 应用广泛和跨平台:台式机和手机的很多APP都采用了HTTP1.1。

16. HTTP/1.1的缺点有哪些?

HTTP协议有优缺点一体的双刃剑,分别为无状态、明文传输,同时还有一大缺点不安全

  1. 无状态
    • 好处:服务器不需要额外的资源来记录状态信息,能减轻服务器的负担。
    • 坏处:由于服务器没有记录HTTP的状态信息,在完成有关联性的操作是会非常麻烦。
      对于无状态的问题,比较简单的解决方法是使用Cookie技术,在客户端第一次请求后,服务器返回的响应报文中携带一个装有客户信息的Cookie,后续客户端再次请求服务器时,在请求报文中带上Cookie,服务器检查Cookie即可。
  2. 明文传输
    • 好处:明文意味着在传输过程中的信息方便阅读,可以直接通过抓包查看报文信息,便于我们的调试工作。
    • 坏处:HTTP的所有信息明文传输,很容易被窃取。
  3. 不安全
    • 通信使用明文,因此内容可能会被窃听;
    • 不验证通信方的身份,因此有可能遭遇伪装;
    • 无法证明报文的完整性, 因此报文有可能被篡改。

17. HTTP/1.1的性能如何?

HTTP协议是基于TCP/IP,并且使用了请求-应答的通信模式,所以性能的关键也在这两点上。

  1. 长连接
    HTTP/1.1 提出了长连接的通信方式好处在于减少了 TCP 连接的重复建立和断开所造成的额外开销,减轻了服务器端的负载。
    持久连接的特点是,只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。
  2. 管道网络传输
    管道网络传输可在同一个 TCP 连接里面,客户端可以发起多个请求,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间。但是服务器必须按照接收请求的顺序发送对这些管道化请求的响应。所以,HTTP/1.1 管道解决了请求的队头阻塞,但是没有解决响应的队头阻塞
  3. 队头阻塞
    当顺序发送的请求序列中的一个请求因为某种原因被阻塞时,在后面排队的所有请求也一同被阻塞了,会导致客户端一直无法得到响应数据,这也就是队头阻塞。

18. HTTP与HTTPS有哪些区别?

  • HTTP是超文本传输协议,信息是明文传输,存在安全风险的问题;HTTPS则解决HTTP不安全的缺陷,在TCPHTTP网络层之间加入了SSL/TLS安全协议,使得报文能够加密传输。
  • HTTP连接建立相对简单,TCP三次握手之后便可进行HTTP的报文传输。而HTTPSTCP三次握手之后,还需进行SSL/TLS的四次握手过程,才可进入加密报文传输。
  • 两者的默认端口不一样,HTTP默认端口号是80HTTPS默认端口号是443
  • HTTPS协议需要向CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的。

你可能感兴趣的:(计算机网络笔记,计算机网络,php,开发语言)