计网常见面试问题总结

全文布局概况是OSI模型和TCP/IP模型,TCP和UDP,HTTP和HTTPS及一些拓展,文章问题由个人在刷面经中遇到,熟记能解决大概90%的计网基本面试问题,表述方面如有问题欢迎评论区指出

OSI七层模型的作用:
应用层:能够产生流量,能与用户交互的的应用程序
表示层:加密 压缩,开发人员
会话层:服务和客户端建立的会话 查木马 netstat -nb
传输层:可靠传输:建立会话 不可靠传输 流量控制
网络层:IP地址编址 选择最佳路径
数据链路层:数据如何封装 添加物理层地址,Mac
物理层:电压,接口标准

TCP/IP 是互联网相关的各类协议族的总称,比如:TCP,UDP,IP,FTP,HTTP,ICMP,SMTP 等都属于 TCP/IP 族内的协议。
TCP/IP模型是互联网的基础,它是一系列网络协议的总称。这些协议可以划分为四层,分别为链路层、网络层、传输层和应用层。

OSI每层的相关协议:
计网常见面试问题总结
TCP/UDP:
UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。
特点:
 面向无连接
 有单播,多播,广播的功能
 UDP是面向报文的
 不可靠性
 头部开销小,传输数据报文时是很高效的

基于UDP如何实现可靠性传输?
UDP它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。
传输层无法保证数据的可靠传输,只能通过应用层来实现了。实现的方式可以参照tcp可靠性传输的方式,只是实现不在传输层,实现转移到了应用层。
实现确认机制、重传机制、窗口确认机制。
如果你不利用Linux协议栈以及上层socket机制,自己通过抓包和发包的方式去实现可靠性传输,那么必须实现如下功能:
发送:包的分片、包确认、包的重发
接收:包的调序、包的序号确认
目前有如下开源程序利用udp实现了可靠的数据传输。分别为RUDP、RTP、UDT。

TCP协议全称是传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议,由 IETF 的RFC 793定义。TCP 是面向连接的、可靠的流协议。流就是指不间断的数据结构,你可以把它想象成排水管中的水流。
特点:
 面向连接
 仅支持单播传输
 面向字节流
 可靠传输
 提供拥塞控制
 TCP提供全双工通信

三次握手:
计网常见面试问题总结
第一次握手:建立连接时,客户端发送SYN包(seq=x)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
第二次握手:服务器收到SYN包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

四次挥手:
计网常见面试问题总结

  1. 客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其***为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入
    FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
  2. 服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的***seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
  3. 客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
  4. 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的***为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
  5. 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的***是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
  6. 服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

TCP还提供了哪些方式保证可靠传输
 确认和重传
 数据校验
 数据合理分片和排序
 流量控制
 拥塞控制

为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。

为什么不能用两次握手进行连接?
答:3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始***进行协商,这个***在握手过程中被发送和确认。现在把三次握手改成仅需要两次握手,死锁是可能发生的。举个例子,考虑计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发送了确认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S 是否已准备好,不知道S建立什么样的***,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分 组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。

如果已经建立了连接,但是客户端突然出现故障了怎么办?
TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

TCP和UDP的比较
计网常见面试问题总结
拓展:
DNS解析及其过程:
当应用过程需要将一个主机域名映射为IP地址时,就调用域名解析函数,解析函数将待转换的域名放在DNS请求中,以UDP报文方式发给本地域名服务器。本地的域名服务器查到域名后,将对应的IP地址放在应答报文中返回。同时域名服务器还必须具有连向其他服务器的信息以支持不能解析时的转发。若域名服务器不能回答该请求,则此域名服务器就暂成为DNS中的另一个客户,向根域名服务器发出请求解析,根域名服务器一定能找到下面的所有二级域名的域名服务器,这样以此类推,一直向下解析,直到查询到所请求的域名。
图解:
计网常见面试问题总结
Http/Https:
HTTP:超文本传输协议,是一个基于请求与响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据,互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准。设计HTTP的初衷是为了提供一种发布和接收HTML页面的方法。

HTTP发展
计网常见面试问题总结
特点:
HTTP1.0
• 无状态、无连接
HTTP1.1
• 持久连接
• 请求管道化
• 增加缓存处理(新的字段如cache-control)
• 增加Host字段、支持断点传输等
HTTP2.0
• 二进制分帧
• 多路复用(或连接共享)
• 头部压缩
• 服务器推送

HTTP报文结构:
计网常见面试问题总结
HTTP协议请求方式
计网常见面试问题总结
GET与POST的区别
Get是幂等且安全的
Post是不幂等,不安全的
Get是把请求的数据放在请求头的后面,post则是将数据放在http包的包体中,所以get的数据安全方面比post低
Get有缓存,post没有
(注:

  1. 安全性是指外系统对该接口的访问,不会使服务器资源的状态发生改变
  2. 幂等性(Idempotent)是一个数学上的概念,在这里是指外系统对同一REST接口的多次访问,得到的资源状态是相同的。在网速不够快的情况下,客户端发送一个请求后不能立即得到响应,由于不能确定是否请求是否被成功提交,所以它有可能会再次发送另一个相同的请求,幂等性决定了第二个请求是否有效。)
    这篇文章分析get和post更清楚:get和post的区别

长连接、短连接
在HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源(如JavaScript文件、图像文件、CSS文件等),每遇到这样一个Web资源,浏览器就会重新建立一个HTTP会话。
而从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头加入这行代码:Connection:keep-alive
在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。
HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。

HTTP缓存
浏览器缓存分为强缓存和协商缓存,浏览器加载一个页面的简单流程如下:

  1. 浏览器先根据这个资源的http头信息来判断是否命中强缓存。如果命中则直接加在缓存中的资源,并不会将请求发送到服务器。
  2. 如果未命中强缓存,则浏览器会将资源加载请求发送到服务器。服务器来判断浏览器本地缓存是否失效。若可以使用,则服务器并不会返回资源信息,浏览器继续从缓存加载资源。
  3. 如果未命中协商缓存,则服务器会将完整的资源返回给浏览器,浏览器加载新资源,并更新缓存。

HTTP分段上传文件怎么保证正确
Etag 由服务器端生成,客户端通过 If-Range 条件判断请求来验证资源是否修改。请求一个文件的流程如下:
第一次请求:

  1. 客户端发起 HTTP GET 请求一个文件。
  2. 服务器处理请求,返回文件内容以及相应的 Header,其中包括
    Etag(例如:627-4d648041f6b80)(假设服务器支持 Etag 生成并已开启了 Etag)状态码为 200。

第二次请求(断点续传):

  1. 客户端发起 HTTP GET 请求一个文件,同时发送 If-Range(该头的内容就是第一次请求时服务器返回的Etag:627-4d648041f6b80)。
  2. 服务器判断接收到的 Etag 和计算出来的 Etag是否匹配,如果匹配,那么响应的状态码为 206;否则,状态码为 200。

http连接优化

  1. 并行连接(能够同一时候和多台server建立HTTP连接)
  2. 持久连接
  3. 管道化连接
  4. 复用的连接

HTTP性能优化
1.服务器
衡量服务器性能的指标,主要有以下几个:
a.吞吐量(或TPS、RPS、QPS)
b.并发数
c.响应时间
d.资源利用率(CPU、内存、硬盘、网络)
2.客户端
因为数据都要通过网络从服务器获取,所以它最基本的性能指标就是:延迟。所谓的“延迟”其实就是“等待”,等待数据到达客户端时所花费的时间。延迟的原因,有几点:
a.距离:由于地理距离导致的延迟,是无法客服的,比如访问数千公里外的网站。
b.带宽
c.DNS查询(如果域名在本地没有缓存的话)
d.TCP握手(必须要经过 SYN、SYN/ACK、ACK 三个包之后才能建立连接)
3.传输链路(客户端和服务器之间的传输链路)
使用CDN等技术,总之,要增加带宽,降低延迟,优化传输速度。

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

HTTPS如何实现安全传输
计网常见面试问题总结
参考:
面试常考题:
https://blog.csdn.net/qq_38289815/article/details/80969419
解析TCP之滑动窗口:
https://blog.csdn.net/yao5hed/article/details/81046945
TCP/UDP:
https://www.cnblogs.com/fundebug/p/differences-of-tcp-and-udp.html
http连接优化:
https://blog.csdn.net/weixin_34056162/article/details/85880162
HTTP性能优化:
https://blog.51cto.com/11009785/2449286?source=dra
TCP的三次握手与四次挥手理解及面试题:
https://blog.csdn.net/qq_38950316/article/details/81087809
HTTP和HTTPS的区别:
https://blog.csdn.net/xiaoming100001/article/details/81109617
长连接:
https://www.cnblogs.com/blogtech/p/10981606.html
HTTP分段上传:
https://www.cnblogs.com/findumars/p/5745345.html
HTTP缓存:
https://www.cnblogs.com/ranyonsue/p/8918908.html
udp如何实现可靠性传输:
https://blog.csdn.net/gettogetto/article/details/76736365
DNS解析过程:
https://blog.csdn.net/yanshuanche3765/article/details/82589210