Catalog
  1. 1. 计网面试复习
  2. 2. 计算机网络分为哪几层?
  3. 3. OSI 七层协议模型
  4. 4. TCP/IP协议簇四层模型
  5. 5. 五层协议
  6. 6. TCP和UDP有什么区别?
  7. 7. 什么场景用TCP,什么场景用UDP?
    1. 7.1. TCP的应用场景
    2. 7.2. UDP的应用场景
  8. 8. TCP的流量控制
  9. 9. TCP的拥塞控制
    1. 9.1. 慢启动(slow start)
    2. 9.2. 拥塞避免(Congestion Avoidance)
    3. 9.3. 快速恢复
    4. 9.4. 总结
  10. 10. TCP可靠数据传输
    1. 10.1. 回退N步 Go-back-N(GBN)
    2. 10.2. 选择重传Selective Repeat(SR)
  11. 11. TCP三次握手
    1. 11.1. 第一次握手
      1. 11.1.1. 第一个包丢失 (A发送给B的SYN中途丢失)
    2. 11.2. 第二次握手
      1. 11.2.1. 第二个包丢失(B发给A的SYN和ACK中途丢失)
    3. 11.3. 第三次握手
      1. 11.3.1. 第三个包丢失
    4. 11.4. TCP 为什么是三次握手,而不是两次或四次?
  12. 12. TCP四次挥手
    1. 12.1. 第一次挥手
    2. 12.2. 第二次挥手
    3. 12.3. 第三次挥手
    4. 12.4. 第四次挥手
    5. 12.5. TIME_WAIT状态
      1. 12.5.1. TIME_WAIT的意义
      2. 12.5.2. 大量的TIME_WAIT
      3. 12.5.3. 解决大量的TIME_WAIT
      4. 12.5.4. 解决大量的CLOSE_WAIT
  13. 13. HTTP协议
    1. 13.1. HTTP非持续连接
    2. 13.2. HTTP持续连接
      1. 13.2.1. 非流水线型
      2. 13.2.2. 流水线型
    3. 13.3. HTTP报文格式
  14. 14. HTTP常见状态码
    1. 14.1. 2XX——表明请求被正常处理了
    2. 14.2. 3XX——表明浏览器需要执行某些特殊的处理以正确处理请求
    3. 14.3. 4XX——表明客户端是发生错误的原因所在。
    4. 14.4. 5XX——服务器本身发生错误
  15. 15. HTTPS协议
  16. 16. 浏览器输入url后经历了什么
  17. 17. DNS查询流程
    1. 17.1. 迭代查询
    2. 17.2. 递归查询
  18. 18. Get和Post的区别
  19. 19. 动态主机配置协议(Dynamic Host Configuration Protocol)
  20. 20. 网络地址转换(Network Address Translation)
    1. 20.1. NAT 转换问题
  21. 21. 互联网控制报文协议(Internet Control Message Protocol)
  22. 22. 地址解析协议(Address Resolution Protocol)
    1. 22.1. 同一局域网下
      1. 22.1.1. ARP分组
      2. 22.1.2. ARP总结
计算机网络 | 面试准备

计网面试复习

下星期阿里的C++后台开发网络面试准备

计算机网络分为哪几层?

OSI 七层协议模型

自顶向下分别是:应用层,表示层,会话层,网络层,数据链路层和物理层

TCP/IP协议簇四层模型

自定向下分别是:应用层、传输层、网络层,网络接口层

五层协议

自顶向下分别是:应用层、传输层、网络层、数据链路层、物理层


TCP和UDP有什么区别?

  1. TCP是面向连接的传输,在传输之前需要三次握手建立连接,且在关闭连接时要进行四次挥手;UDP提供无连接的传输,在传输时不需要建立连接。
  2. TCP提供可靠的传输(有序、无差错、不重复、不丢失);UDP提供不可靠的传输
  3. TCP面向字节流传输,它能将信息分割成组,并在接收端将其重组;UDP是面向数据报的传输,没有分组的开销。
  4. TCP提供拥塞控制和流量控制;UDP没有提供。
  5. TCP首部有最少20字节;UDP首部最少8字节

什么场景用TCP,什么场景用UDP?

TCP的应用场景

效率要求相对较低,但是准确性要求高的场景下。如:文件传输,远程登录。

UDP的应用场景

效率要求相对较高,但是准确性要求低的场景下。如:QQ聊天,在线视频,网络语音电话。


TCP的流量控制

TCP为其应用程序提供了流量控制服务(flow-control service),避免了接收方的缓存因为传输太多太快而溢出

TCP发送方也可能因为IP网络的拥塞而被遏制,这被称作拥塞控制

TCP通过让发送方维护一个称为接收窗口(receive window)的变量,表示为rwnd,来提供流量控制。

接收窗口用于告诉发送方,接收方还剩余多少缓存空间。发送方和接收方各维护一个接收窗口,建立连接的双方互相知道彼此剩余的缓冲区大小。


TCP的拥塞控制

TCP拥塞控制维护一个称为拥塞窗口(congestion windows)的变量,表示为cwnd,来对网络中发送流量的速率进行限制。

特别,在一个发送方中未被确认的数量,不会超过cwnd和rwnd中的最小值,即
$$
LastByteSent−LastByteAcked≤(mincwnd,rwnd)
$$

cwnd是动态的,具有感知网络拥塞的功能

慢启动(slow start)

当连接开始时,速率在遇见loss事件之前会不断增加

  • 最初cwnd = 1MSS
  • 每当传输的报文段首次被确认就增加 1 MSS

慢启动过程中还设定一个ssthresh(慢启动阈值)来表示最大窗口大小来防止cwnd增长过大

  • 当cwnd<ssthresh时,使用慢启动算法
  • 当cwnd>ssthresh时,使用拥塞避免算法

如果检测到3个冗余的ACK,TCP将执行一种快速重传并进入快速恢复状态,且ssthresh被设置为$\frac {cwnd}{2}$,cwnd被设置为 ssthresh+3

如果出现超时的情况,ssthresh将被设置为 $\frac {cwnd}2$,cwnd被重置为1,并重新进入慢启动状态

拥塞避免(Congestion Avoidance)

当cwnd等于ssthresh时,TCP结束慢启动,进入拥塞避免阶段。

进入拥塞避免状态后,每个RTT只增加一个MSS,即每收到一个ACK,只增加$\frac {MSS}{cwnd}$

如果检测到3个冗余ACK,TCP将进入快速恢复状态,且ssthresh被设置为$\frac{cwnd} 2$,cwnd被设置为 ssthresh+3

快速恢复

在快速恢复中,对收到的每个冗余的ACK,cwnd的值只增加1个MSS。

当丢包(超时)事件出现时,ssthresh将被设置为$\frac {cwnd}2$,cwnd被重置为1,并重新进入慢启动状态。

总结


TCP可靠数据传输

TCP是一个可靠的传输协议是基于其可靠的数据传输

回退N步 Go-back-N(GBN)

在回退N步协议中,允许发送方发送多个分组而不需等待确认。

GBN对于序号n的分组采取累积确认的方式,表示接收方已正确接到序号为n以及n以前的分组,接收方将丢弃所有乱序的分组。

例如发送方发送了(0,1,2,3,4),但是0号包的ACK在回来的时候丢失了,不影响后续的传输,因为收到1号(或者后续的包)表示0号包已经收到了。

GBN协议也被称作为滑动窗口协议,发送方每收到接收方发回的一个正确的ACK,就会将窗口向右移动一个单位

GBN中维护一个计时器,如果出现超时,发送方将重传所有已发送但未收到确认的分组。

计时器表示最早的已发送但未被确认的分组的计时器

  • 每收到一个ACK,但仍有已发送未被确认的分组,定时器会被重启。
  • 如果没有已发送未被确认的分组,定时器将被终止

例如,发送方现在发送0 1 2 3 四个包,计时器在0号包发出时开始计时,此时是作为0号包的计时器。当收到0号包的ACK时,任存在未被确认的包(1,2,3),此时重启定时器,为最早的未被确认的(1号包)

选择重传Selective Repeat(SR)

在SR协议中,接收方会将乱序的包缓存起来

接收方每收到一个包,就会回复该包序号的ACK

发送方每接收到一个ACK,就会将窗口向右移动一个单位

SR对每一个分组都维护一个计时器,当超时时会重传该分组

回答图上的提问,当ACK2到达时,窗口将向右移动到5的位置,因为ACK3,ACK4都已经正确收到了。


TCP三次握手

TCP建立连接时需要进行三次握手

第一次握手

建立连接时,客户端A发送SYN包(SYN bit=1, Seq = x)到服务器B,等待服务器B确认

客户端进入SYN_SENT状态 服务器处于LISTEN状态

第一个包丢失 (A发送给B的SYN中途丢失)

A会周期性的超时重传,直到收到B的确认

第二次握手

服务器B收到SYN包,同时自己发送一个SYNACK报文段(SYN bit = 1, Seq = y, ACK bit = 1, ACKnum = x + 1)

服务器进入SYN_RCVD状态 客户端处于SYN_SENT状态

第二个包丢失(B发给A的SYN和ACK中途丢失)

B会周期性的重传,直到收到A的确认

第三次握手

客户端接收到服务器返回的SYNACK报文段,自己再发送一个报文段(ACK bit =1, ACKnum = y+1)

客户端进入ESTAB状态 服务器接收到最后一个报文段时候也进入ESTAB状态

此时报文段负载中可以携带客户到服务器的数据

第三个包丢失

A发完ACK,会单方面的认为TCP为Established状态,而B没接收到ACK之前会认为TCP为Active状态

  1. 假设双方都没有数据发送,B会周期性的选择重传,直到收到A的确认,收到确认之后B的TCP连接也为Established状态,双向可以发送数据
  2. 假若A有数据要发送,B收到A的Data+ACK,自然会切换为established状态,并接受A的Data
  3. 假若B有数据要发送,但是B认为连接没有建立成功,会一直周期性的重传SYN+ACK,直到收到A的确认才可以发送数据。

TCP三次握手各个状态的意义:

LISTEN:倾听来自远方TCP端口的连接请求

SYN_SENT:发送连接后等待匹配的连接请求

SYN_RCVD:在收到和发送一个请求后等待确认

ESTAB(LISHED):代表一个打开的连接,可以传送数据

TCP 为什么是三次握手,而不是两次或四次?

TCP 为什么是三次握手,而不是两次或四次?

TCP之所以能保证可靠的数据传输,是基于其sequence number的。

TCP 设计中一个基本设定就是,通过TCP 连接发送的每一个包,都有一个sequence number。而因为每个包都是有序列号的,所以都能被确认收到这些包。

前几天面tap4fun时候,面试官问到,如果TCP没有第三个包会发生什么?

如果没有TCP的第三个包,B就无法知道A是否接受到了自己的同步信号,如果这个同步信号丢失了,A和B的初始序列号就无法达成一致,换句话说,就无法保证可靠的数据传输。

TCP对有数据的TCP segment必须确认,所以在这里A必须给B一个确认,以确认A已经接收到了B的同步信号。


TCP四次挥手

TCP连接是全双工的

第一次挥手

客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。

FIN bit = 1, seq = x(随机)

客户端进入FIN_WAIT_1状态

第二次挥手

服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。

ACK bit = 1, ACK num = x + 1

客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。

第三次挥手

服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。

FIN bit = 1, seq = y(随机)

第四次挥手

客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。

ACK bit = 1, ACK num = y + 1

服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

至此连接完全关闭

TCP四次挥手各个状态的意义

FIN_WAIT1:等待远程TCP的连接中断请求,或先前的连接中断请求的确认

FIN_WAIT2:等待来自远程TCP的连接中断请求

CLOSE_WAIT:等待从本地用户发来的连接中断请求

LAST_ACK:等待发向远程TCP的连接中断请求的确认

TIME_WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认

CLOSED:连接关闭

TIME_WAIT状态

TIME_WAIT状态是面试中很常见的一个问题,面了三次被问了两次

当A发送一个释放报文并且接收到ACK时就会进入FIN_WAIT_2状态

此时若收到B发来的释放报文,就会进入TIME_WAIT状态并且发送一个ACK

此时,按道理来说连接应该关闭了,但是为了确保B能收到关闭的ACK,A会等待2个MSL,以保证B确实收到(如果没收到的话,B会再次发一个释放报文)

TIME_WAIT的意义

参考于:TIME_WAIT和CLOSE_WAIT

TCP要保证在所有可能的情况下使得所有的数据都能够被正确送达。当你关闭一个socket时,主动关闭一端的socket将进入TIME_WAIT状态,而被动关闭一方则转入CLOSED状态,这的确能够保证所有的数据都被传输。

当一个socket关闭的时候,是通过两端四次握手完成的,当一端调用close()时,就说明本端没有数据要发送了。这好似看来在握手完成以后,socket就都可以处于初始的CLOSED状态了,其实不然。原因是这样安排状态有两个问题, 首先,我们没有任何机制保证最后的一个ACK能够正常传输,第二,网络上仍然有可能有残余的数据包(wandering duplicates),我们也必须能够正常处理。
TIMEWAIT就是为了解决这两个问题而生的。

  1. 假设最后一个ACK丢失了,被动关闭一方会重发它的FIN。主动关闭的一方必须维持一个有效状态,以保证被动关闭的一方能够收到最后一个ack。所以这是socket关闭后,仍然处于TIME_WAIT状态的原因之一。

  2. 假设目前连接的通信双方都已经调用了close(),双方进入了closed的终结状态,而没有经过TIME_WAIT状态。那么会出现如下问题,假若有一个新的连接被建立起来,使用的IP地址和端口与先前的完全相同,后建立的连接是先前连接的复用。若仍有残余数据报,这样新的连接收到的数据报还仍然可能是残余的数据报。为了防止这一点,TCP不允许新连接复用TIME_WAIT状态下的socket。这就意味着,一个成功建立的连接,必然使得先前网络中残余的数据报都丢失了。

    所以需要TIME_WAIT来等待两个MSL以保证所有数据成功接收

大量的TIME_WAIT

在高并发短连接的TCP服务器上,当服务器处理完请求后立刻按照主动正常关闭连接。这个场景下,会出现大量的socket处于TIME_WAIT状态。如果客户端的并发量持续很高,此时部分客户端就会显示连接不上。

  1. 高并发可以让服务器短时间内占用大量的端口,而端口只有0~65535。
  2. 短连接表示“业务处理+传输数据的时间远远小于TIME_WAIT超时的时间”的连接。这表示,短时间内完成的业务会因为TIME_WAIT的存在,造成其他HTTP请求无法使用该端口。

解决大量的TIME_WAIT

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
先来看看netstat:
netstat -n
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 123.123.123.123:80 234.234.234.234:12345 TIME_WAIT
你实际执行这条命令的时候,可能会得到成千上万条类似上面的记录,不过我们就拿其中的一条就足够了。

再来看看awk:
/^tcp/
滤出tcp开头的记录,屏蔽udp, socket等无关记录。
state[]相当于定义了一个名叫state的数组
NF
表示记录的字段数,如上所示的记录,NF等于6
$NF
表示某个字段的值,如上所示的记录,$NF也就是$6,表示第6个字段的值,也就是TIME_WAIT
state[$NF]表示数组元素的值,如上所示的记录,就是state[TIME_WAIT]状态的连接数
++state[$NF]表示把某个数加一,如上所示的记录,就是把state[TIME_WAIT]状态的连接数加一
END
表示在最后阶段要执行的命令
for(key in state)
遍历数组

显示TCP各种连接状态的数量,类似于如下信息

发现系统存在大量的TIME_WAIT状态连接,通过调整内核参数解决

vi /etc/sysctl.conf

编辑文件,加入以下内容

1
2
3
4
net.ipv4.tcp_syncookies = 1 
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30

然后执行 /sbin/sysctl -p 让参数生效。

简单来说,就是打开系统的TIME_WAIT重用和快速回收。

net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME_WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME_WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout 修改系默认的 TIME_OUT 时间

解决大量的CLOSE_WAIT

CLOSE_WAIT过多的原因出在程序本身,是由于被动关闭连接处理不当导致的。回到程序中检查连接关闭处理。


HTTP协议

HTTP(HyperText Transfer Protocol)是Web的应用层协议,它是Web的核心。HTTP由两个程序实现:一个客户程序和一个服务器程序。

客户程序和服务器程序运行在不同的端系统中,通过交换HTTP报文进行会话。HTTP定义了这些报文的结构以及客户和服务器进行报文交换的方式。

HTTP使用TCP作为它的支撑运输协议。HTTP客户首先发起一个与服务器的TCP连接。一旦连接建立,该浏览器和服务器进程就可以通过套接字接口访问TCP。

HTTP非持续连接

非持续连接中的TCP连接在服务器发送一个对象后关闭,即该连接不为其他对象而持续下来,一个连接只处理一个请求。

HTTP持续连接

非流水线型

非流水线型表示,需要等待一个请求完成后才能进行下一个请求

流水线型

流水线型表示,能够同时发送多个请求,不需要等待一个请求完成

HTTP报文格式

HTTP请求报文的第一行叫做请求行,其后继的行叫做首部行。

请求行有三个字段

  • 方法字段
  • URL字段
  • HTTP版本字段

方法字段可以取几种不同的值,包括GET,POST,HEAD,PUT和DELETE。

首部行HOST指明了对象所在的主机。

通过包含Connection:close,该浏览器告诉服务器不希望采用持续连接。


HTTP常见状态码

类别 原因短语
1XX Informationnal(信息状态码) 接受的请求正在处理
2XX Success(成功状态码) 请求正常处理完毕
3XX Redirection(重定向状态码) 需要进行附加操作以完成请求
4XX Client Error(客户端错误状态码) 服务器无法处理请求
5XX Server Error(服务器错误状态码) 服务器处理请求出错

2XX——表明请求被正常处理了

  • 200 OK:请求已正常处理。

  • 204 No Content:请求处理成功,但没有任何资源可以返回给客户端,一般在只需要从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用。

  • 206 Partial Content:是对资源某一部分的请求,该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求。响应报文中包含由Content-Range指定范围的实体内容。

3XX——表明浏览器需要执行某些特殊的处理以正确处理请求

  • 301 Moved Permanently:资源的uri已更新,你也更新下你的书签引用吧。永久性重定向,请求的资源已经被分配了新的URI,以后应使用资源现在所指的URI。

  • 302 Found:资源的URI已临时定位到其他位置了,姑且算你已经知道了这个情况了。临时性重定向。和301相似,但302代表的资源不是永久性移动,只是临时性性质的。换句话说,已移动的资源对应的URI将来还有可能发生改变。

  • 303 See Other:资源的URI已更新,你是否能临时按新的URI访问。该状态码表示由于请求对应的资源存在着另一个URL,应使用GET方法定向获取请求的资源。303状态码和302状态码有着相同的功能,但303状态码明确表示客户端应当采用GET方法获取资源,这点与302状态码有区别。

当301,302,303响应状态码返回时,几乎所有的浏览器都会把POST改成GET,并删除请求报文内的主体,之后请求会自动再次发送。

  • 304 Not Modified:资源已找到,但未符合条件请求。该状态码表示客户端发送附带条件的请求时(采用GET方法的请求报文中包含If-Match,If-Modified-Since,If-None-Match,If-Range,If-Unmodified-Since中任一首部)服务端允许请求访问资源,但因发生请求未满足条件的情况后,直接返回304.。

  • 307 Temporary Redirect:临时重定向。与302有相同的含义。

4XX——表明客户端是发生错误的原因所在。

  • 400 Bad Request:服务器端无法理解客户端发送的请求,请求报文中可能存在语法错误。

  • 401 Unauthorized:该状态码表示发送的请求需要有通过HTTP认证(BASIC认证,DIGEST认证)的认证信息。

  • 403 Forbidden:不允许访问那个资源。该状态码表明对请求资源的访问被服务器拒绝了。(权限,未授权IP等)

  • 404 Not Found:服务器上没有请求的资源。路径错误等。

5XX——服务器本身发生错误

  • 500 Internal Server Error:貌似内部资源出故障了。该状态码表明服务器端在执行请求时发生了错误。也有可能是web应用存在bug或某些临时故障。
  • 503 Service Unavailable:抱歉,我现在正在忙着。该状态码表明服务器暂时处于超负载或正在停机维护,现在无法处理请求。

HTTPS协议

参考于:HTTP和HTTPS

HTTPS是一种通过计算机网络进行安全通信的传输协议,经由HTTP进行通信,利用SSL/TLS建立全信道,加密数据包。HTTPS使用的主要目的是提供对网站服务器的身份认证,同时保护交换数据的隐私与完整性。

基于HTTP协议,通过SSL或TLS提供加密处理数据、验证对方身份以及数据完整性保护

  1. 内容加密:采用混合加密技术,中间者无法直接查看明文内容
  2. 验证身份:通过证书认证客户端访问的是自己的服务器
  3. 保护数据完整性:防止传输的内容被中间人冒充或者篡改

混合加密:结合非对称加密和对称加密技术。客户端使用对称加密生成密钥对传输数据进行加密,然后使用非对称加密的公钥再对秘钥进行加密,所以网络上传输的数据是被秘钥加密的密文和用公钥加密后的秘密秘钥,因此即使被黑客截取,由于没有私钥,无法获取到加密明文的秘钥,便无法获取到明文数据。

数字摘要:通过单向hash函数对原文进行哈希,将需加密的明文“摘要”成一串固定长度(如128bit)的密文,不同的明文摘要成的密文其结果总是不相同,同样的明文其摘要必定一致,并且即使知道了摘要也不能反推出明文。

数字签名技术:数字签名建立在公钥加密体制基础上,是公钥加密技术的另一类应用。它把公钥加密技术和数字摘要结合起来,形成了实用的数字签名技术。


浏览器输入url后经历了什么

一次完整的HTTP请求

域名解析 –> 发起TCP的3次握手 –> 建立TCP连接后发起http请求 –> 服务器响应http请求,浏览器得到html代码 –> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等) –> 浏览器对页面进行渲染呈现给用户

  1. 首先进行域名解析,域名解析具体过程讲一下:

    浏览器搜索自己的DNS缓存,缓存中维护一张域名与IP地址的对应表;
    若没有,则搜索操作系统的DNS缓存;
    若没有,则操作系统将域名发送至本地域名服务器(递归查询方式),本地域名服务器查询自己的DNS缓存,查找成功则返回结果,否则,通过以下方式迭代查找:
    本地域名服务器向根域名服务器发起请求,根域名服务器返回com域的顶级域名服务器的地址;

    本地域名服务器向com域的顶级域名服务器发起请求,返回权限域名服务器地址;

    本地域名服务器向权限域名服务器发起请求,得到IP地址;

    本地域名服务器将得到的IP地址返回给操作系统,同时自己将IP地址缓存起来;
    操作系统将IP地址返回给浏览器,同时自己也将IP地址缓存起来;
    至此,浏览器已经得到了域名对应的IP地址。

  2. 浏览器发起HTTP请求;

  3. 接下来到了传输层,选择传输协议,TCP是可靠的传输控制协议,对HTTP请求进行封装,加入了端口号等信息;

  4. 然后到了网络层,通过IP协议将IP地址封装为IP数据报;然后此时会用到ARP协议,主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址,找到目的MAC地址;

  5. 接下来到了数据链路层,把网络层交下来的IP数据报添加首部和尾部,封装为MAC帧,现在根据目的mac开始建立TCP连接,三次握手,接收端在收到物理层上交的比特流后,根据首尾的标记,识别帧的开始和结束,将中间的数据部分上交给网络层,然后层层向上传递到应用层;

  6. 服务器响应请求并请求客户端要的资源,传回给客户端;

  7. 断开TCP连接,浏览器对页面进行渲染呈现给客户端。


DNS查询流程

DNS查询有两种,一种为迭代查询一种为递归查询。

迭代查询

迭代查询指的是,

  1. 向本地DNS服务器查询
  2. 本地DNS服务器向根域名服务器查询,根域名服务器告诉本地域名服务器下一步该去哪里查询…

总而言之就是,一切操作都由本地域名服务器来做

递归查询

递归查询指的是,

  1. 向本地DNS服务器查询
  2. 本地DNS服务器向根域名服务器查询,根域名服务器知道下一个查询的服务器,继续查询,直到最后一个再依次返回

本地DNS服务器只需要查询一次,剩下的交给其他人来做,最后会得到一个结果返回,像函数的递归调用一样。


Get和Post的区别

参考于:Get和Post的区别

GET的语义是请求获取指定的资源。GET方法是安全、幂等、可缓存的(除非有 Cache-ControlHeader的约束),GET方法的报文主体没有任何语义。

POST的语义是根据请求负荷(报文主体)对指定的资源做出处理,具体的处理方式视资源类型而不同。POST不安全,不幂等,(大部分实现)不可缓存。为了针对其不可缓存性,有一系列的方法来进行优化,以后有机会再研究(FLAG已经立起)。

还是举一个通俗栗子吧,在微博这个场景里,GET的语义会被用在「看看我的Timeline上最新的20条微博」这样的场景,而POST的语义会被用在「发微博、评论、点赞」这样的场景中。


动态主机配置协议(Dynamic Host Configuration Protocol)

某组织一旦获得了一块地址,它就可以为本组织内的主机与路由器接口逐个分配IP地址。系统管理员通常采用手工配置路由器中的IP地址。但这个更多的由 动态主机配置协议(DHCP)来完成。

DHCP允许主机自动获取一个IP地址(还包括它的子网掩码,默认网关,本地DNS服务器的地址)

yiaddr == your Internet address

DHCP协议是一个4个步骤的过程:

  • DHCP服务器发现。一个新到的主机的首要任务是发现一个要与其交互的DHCP服务器。通过发送一个DHCP发现报文(DHCP discover message)完成。客户在UDP分组中向端口67发送该发现报文。其中目的地址为广播地址:255.255.255.255:67,源地址为本机地址:0.0.0.0:68。
  • DHCP服务器提供。DHCP服务器收到一个DHCP发现报文时,用一个DHCP提供报文(DHCP offer message)。子网中可能存在多个DHCP服务器,所以要采用广播的方式。源地址:255.255.255.255:67。目的地址:0.0.0.0:68。每台服务器提供的报文包含有收到的发现报文的事务ID、向客户推荐的IP地址、网络掩码以及IP地址租用期(address lease time),即IP地址有效时间量。服务器租用期通常设置为几小时或几天。
  • DHCP请求。新到达的客户从一个或者多个服务器中选择一个,并向其中的服务器提供一个DHCP请求报文(DHCP request message)进行响应,回显配置参数。
  • DHCP ACK。服务器用DHCP ACK报文(DCHP ACKmessage)进行响应,证实所要求的参数。

一旦客户收到DHCP ACK后,交互便完成了,并且该客户能够在租用期内使用DHCP分配的IP地址。


网络地址转换(Network Address Translation)

装有NAT软件的路由器被称作NAT路由器,此路由器上存在NAT转换表(NAT translation table),并且在表中包含了端口号及其IP地址。

通过使用少量公有IP地址代表较多私有IP地址的方式,NAT一定程度上解决了IPV4地址短缺的问题。

NAT 转换问题

客户端想要访问地址为10.0.0.1的服务器

  • 服务器的本地地址为10.0.0.1,客户端无法将其作为目的地址
  • 只有一个外部可见的NAT地址:138.75.29.7

Solution 1: 静态配置NAT向服务器转发传入的给定端口的连接请求

  • 例如,(138.76.29.7, port 25000),总是转发到10.0.0.1 port 25000

Solution 2:即插即用(Universal Plug and Play, UPnP),使在主机运行的应用程序能够为某些请求公有端口号请求一个NAT映射,该映射位于(专用IP地址,专用端口号)和(公共IP地址,公共端口号)。

  • 知道公有IP地址(138.76.29.7)

  • 添加/移除端口映射

    即,自动执行静态NAT端口映射配置


互联网控制报文协议(Internet Control Message Protocol)

ICMP由RFC 792定义,被主机和路由器用来彼此沟通网络层的信息。

ICMP提供差错报告,如“目的网络不可达”之类的错误报文。

ICMP类型 编码 描述
0 0 回显回答(对ping的回答)
3 0 目的网络不可达
3 1 目的主机不可达
3 2 目的协议不可达
3 3 目的端口不可达
3 6 目的网络未知
3 7 目的主机未知
3 0 源抑制(拥塞控制)
4 0 回显请求
9 0 路由器通告
10 0 路由器发现
11 0 TTL(Time To Live)过期
12 0 IP首部损坏
  1. ICMP是IP层的一个组成部分。它传递差错报文以及其他需要注意的信息。ICMP报文通常被IP层或者更高层协议(TCP/UDP)使用。一些ICMP报文把差错报文返回给用户进程
  2. ICMP报文是在IP数据报内部传输的
  3. IP数据报由IP首部和ICMP报文组成
  4. 常用的ping程序使用的就是ICMP协议

ping 程序是发送一个 ICMP类型8编码0的报文到指定主机。

目的主机回发一个类型0编码0的ICMP回显回答。


地址解析协议(Address Resolution Protocol)

ARP用于实现从IP地址到MAC(Media Access Control)地址到映射,即询问目标IP对应的MAC地址。

在网络通信中,主机和主机通信的数据包需要依据OSI模型从上到下的数据封装,当数据封装完整后,再向外发出。所以在局域网的通信中,不仅需要源目的IP地址

  • 每一个IP结点在局域网下都有一个ARP表
  • 存有IP地址到MAC地址的映射

同一局域网下

  1. A结点想要向B结点发送但发现B的MAC地址不在A的ARP表中
  2. A广播ARP query packet,包含了B的IP地址,就是在问,谁是这个IP地址,我想知道你的MAC地址
    • 目标MAC地址为:FF-FF-FF-FF-FF-FF
    • 同一局域网下的所有机器都收到这个ARP请求
  3. B接收到ARP packet,向A回复了自己的MAC地址,我是这个IP地址,我的MAC地址是…
    • 通过单播的方式

ARP分组

假设主机A想知道主机B的MAC地址

分组类型 源IP 目的IP 源MAC 目的MAC
广播ARP请求分组 A’s IP B’s IP A’s MAC FF-FF-FF-FF-FF-FF
单播ARP响应分组 B’s IP A’s IP B’s MAC A’s MAC

ARP总结

  1. 主机A发给本网络的主机B,用ARP找到主机B的硬件地址。
  2. 主机A发给另一网络上的主机B,用ARP找到网关的硬件地址
  3. 路由器发给本网络上的主机A,用ARP找到主机A的硬件地址
  4. 路由器发给另一网络的主机B,用ARP找到本网络上的一个路由器的硬件地址

Author: Jsthcit
Link: http://jsthcitpizifly.com/2020/03/20/Computer-Network-Interview/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Donate
  • 微信
  • 支付寶