秃头系列-八股文之网络编程

162 阅读14分钟

「这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战

前言

这算是秃头系列的第三个系列第七篇文章了,主要针对网络编程的面试八股文的,当然,虽然平时工作中我们很少用到下面的知识点,但是一些理论知识还是需要了解下的,下面欢迎各位看官阅读。


网络编程

七层/五层架构

七层架构

  • 应用层
    • 功能:文件传输,电子邮件,文件服务
    • 协议:TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet
  • 表示层
    • 功能:数据格式化,代码转换,数据加密
  • 会话层
    • 功能:解除或建立与别的接点的联系
  • 传输层
    • 功能:提供端对端的接口
    • 协议:TCP、UDP
  • 网络层
    • 功能:为数据包选择路由
    • 协议:IP,ICMP,RIP,OSPF,BGP,IGMP
  • 数据链路层
    • 功能:传输有地址的帧以及错误检测功能
  • 物理层
    • 功能:以二进制数据形式在物理媒体上传输数据

五层结构

  • 应用层
  • 传输层
  • 网络层
  • 数据链路层
  • 物理层

面试题:路由器是在哪层, tcp http等各种协议是哪层?

  • 路由器在网络层
    • 路由器使用IP地址进行寻址
  • TCP在传输层
  • Http在应用层

面试题:Http和Https 区别 *

  1. HTTP明文传输,数据都是未加密的,安全性较差,HTTPS(SSL+HTTP)数据传输过程是加密的,安全性较好。
  2. 使用HTTPS协议需要到CA(Certificate Authority,数字证书认证机构)申请证书,一般免费证书较少,因而需要一定费用。
  3. HTTP页面响应速度比HTTPS快,
    • 主要是因为HTTP使用TCP三次握手建立连接,客户端和服务器需要交换3个包,
    • 而HTTPS除了TCP的三个包,还要加上ssl握手需要的9个包,所以一共是12个包。
  4. http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
  5. HTTPS其实就是建构在SSL/TLS之上的HTTP协议,所以,要比较HTTPS比HTTP要更耗费服务器资源。

HTTP和HTTPS的请求过程

HTTP的请求过程:

  1. TCP建立连接后,客户端会发送报文给服务端
  2. 服务端接收报文并作出响应
  3. 客户端收到响应后解析给用户

HTTPS的请求过程:

  1. 客户端发送请求到服务端;
  2. 服务器返回证书和公钥
  3. 客户端验证证书和公钥的有效性,如果有效,则生成对称密钥并使用公钥加密发送到服务
  4. 服务端使用私钥解密报文,并使用收到的对称密钥加密报文,发送到客户端;
  5. 客户端使用对称密钥解密报文,并对信息进行验真
  6. SSL加密建立

TCP

TCP和UDP的区别

  1. 面向连接和无连接
  2. 可靠性,TCP可靠,UDP容易丢失数据
  3. 有序性,TCP利用序列号保证了消息包的顺序交付
  4. 速度,TCP比较慢,因为要创立连接。
  5. 量级,TCP是重量级的,头部20个字节;UDP是轻量级的,头部8个字节

三次握手 **

  1. 刚开始客户端处于 closed 的状态,服务端处于 listen 状态
  2. 第一次握手:客户端给服务端发一个SYN报文,并指明客户端的初始化序列号ISN(c)。此时客户端处于 SYN_Send 状态
  3. 第二次握手:服务器收到客户端的 SYN 报文之后,会以自己(服务端)的 SYN 报文作为应答,并且也是指定了自己的初始化序列号 ISN(s),同时会把客户端的 ISN + 1 作为 ACK 的值,表示自己已经收到了客户端的 SYN,此时服务器处于 SYN_REVD 的状态。
  4. 第三次握手:客户端收到 SYN 报文之后,会发送一个 ACK 报文,当然,也是一样把服务器的 ISN + 1 作为 ACK 的值,表示已经收到了服务端的 SYN 报文,此时客户端处于 establised(就绪) 状态;可以携带数据
  5. 服务器收到 ACK 报文之后,也处于 establised 状态,此时,双方以建立起了链接。

总结:

  • 客户端发起两次握手
    • 第一次发送:SYN报文、初始化序列化ISN,进入ISN_Send状态
    • 第二次发送:此时已收到服务端的回报,接收:服务端的ACK,再次发送一个ACK报文(服务器的ISN+1),处于就绪状态
  • 服务端发起一次握手
    • 收到客户端的第一次握手发送信息,将自己的SYN、ISN以及ACK作为回执给到客户端

面试题:TCP三次连接,这个listen backLog有什么作用

backLog,两个队列(半连接队列、全连接队列),分别存放SYN_RCVD状态、ESTABLISHED状态的连接

  • 服务器第一次收到客户端的SYN之后,就会处于SYN_RCVD状态,此时双方还没有完全建立其连接,服务器会把此种状态下请求连接放在一个队列里,我们把这种队列称之为半连接队列
  • 当然还有一个全连接队列,就是已经完成三次握手,建立起连接的就会放在全连接队列中。如果队列满了就有可能会出现丢包现象。
    • 服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。注意,每次重传等待的时间不一定相同,一般会是指数增长,例如间隔时间为 1s, 2s, 4s, 8s, ….

面试题:三次握手的作用 **

  1. 确认双方的接受能力、发送能力是否正常。
  2. 指定自己的初始化序列号,为后面的可靠传送做准备。
  3. 如果是 https 协议的话,三次握手这个过程,还会进行数字证书的验证以及加密密钥的生成

面试题:两次握手为什么不可以?**

  1. 第一次握手:客户端的发送能力、服务端的接收能力是正常的
  2. 第二次握手:服务端的接收、发送能力,客户端的接收、发送能力是正常的。不过此时服务器并不能确认客户端的接收能力是否正常。
  3. 第三次握手:客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常 因此,需要三次握手才能确认双方的接收与发送能力是否正常。

同时,如果采取两次握手,那么只要服务器发出确认数据包就会建立连接,但由于客户端此时并未响应服务端的请求,那此时服务端就会一直在等待客户端,这样服务器就白白浪费了一定的资源。

若采用三次握手,服务器没有收到来自客户端的再次确认,则就会知道客户端并没有要求建立请求,就不会浪费服务器的资源

四次挥手 **

  1. 第一次挥手:客户端发送一个FIN报文,报文中会指定一个序列号。此时客户端处于CLOSED_WAIT1状态
  2. 第二次握手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序列号值 + 1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT2状态
  3. 第三次挥手:如果服务端也想断开连接了,和客户端的第一次挥手一样,发给FIN报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态。
  4. 第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答,且把服务端的序列号值 + 1 作为自己 ACK 报文的序列号值,此时客户端处于TIME_WAIT状态。需要过一阵子(2MSL)以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED 状态
  5. 服务端收到 ACK 报文之后,就处于关闭连接了,处于 CLOSED 状态

面试题:TCP四次挥手,Time WAIT发生在哪方;两个超时重传时间的作用;大量timeout怎么处理,Time_wait过多怎么办? **

  • Time WAIT 发生在客户端
  • 两个超时重传时间的作用(为什么客户端发送 ACK 之后不直接关闭,而是要等一阵子才关闭):
    • 为了保证客户端发送的最后一个ACK报文段能够到达服务器
      • 因为这个ACK有可能丢失,从而导致处在LAST-ACK状态的服务器收不到对FIN-ACK的确认报文。服务器会超时重传这个FIN-ACK,接着客户端再重传一次确认,重新启动时间等待计时器。最后客户端和服务器都能正常的关闭。假设客户端不等待2MSL,而是在发送完ACK之后直接释放关闭,一但这个ACK丢失的话,服务器就无法正常的进入关闭连接状态
    • 可以防止已失效的报文段
      • 客户端在发送最后一个ACK之后,再经过经过2MSL,就可以使本链接持续时间内所产生的所有报文段都从网络中消失。从保证在关闭连接后不会有还在网络中滞留的报文段去骚扰服务器。
  • 出现大量Time_Wait:
    • 存在大量短连接,并且由该方主动关闭。一般出现在web服务器中,因为HTTP关闭TCP连接的是Server端。

面试题:第2次挥手的之后,这时候给服务端发大量的包,服务端会怎样处理?

  • 服务端依旧会正常处理数据包
  • 连接关闭时,当收到对方的FIN报文时,仅仅表示对方不在发送数据了,但是还能接收数据,乙方也未必全部数据都发送对方了

面试题:谈谈你对TCP / IP 协议的了解

  1. TCP/IP是一个协议簇,是一个开放的协议标准,所有人都可以免费使用,并且是独立于硬件和操作系统的。
  2. TCP/IP协议是不区分网络硬件的,它在局域网,广域网和互联网中都被广泛使用。
  3. TCP/IP协议使用统一的网络地址分配的方案,网络中的每台电脑都具有唯一的IP地址。
  4. TCP/IP协议是一个标准的高层协议,拥有极高的可靠性,可以为用户提供可靠的服务。

面试题:TCP的可靠性保证

  • 校验和
  • 确认应答与序列号
    • 序列号:TCP传输时将每个字节的数据都进行了编号,这就是序列号
      • 序列号的作用不仅仅是应答的作用,有了序列号能够将接收到的数据根据序列号排序,并且去掉重复序列号的数据。这也是TCP传输可靠性的保证之一
    • 确认应答:TCP传输的过程中,每次接收方收到数据后,都会对传输方进行确认应答。也就是发送ACK报文。这个ACK报文当中带有对应的确认序列号,告诉发送方,接收到了哪些数据,下一次的数据从哪里发
  • 超时重传
    • 发送方在发送完数据后等待一个时间,时间到达没有接收到ACK报文,那么对刚才发送的数据进行重新发送
    • 最大超时时间(也就是等待的时间)是动态计算的
  • 连接管理
    • 连接管理就是三次握手与四次挥手的过程
  • 流量控制 **
    • 接收端在接收到数据后,对其进行处理。如果发送端的发送速度太快,导致接收端的结束缓冲区很快的填充满了
    • 在TCP协议的报头信息当中,有一个16位字段的窗口大小。
      • 窗口大小的内容实际上是接收端接收数据缓冲区的剩余大小。这个数字越大,证明接收端接收缓冲区的剩余空间越大,网络的吞吐量越大。
      • 接收端会在确认应答发送ACK报文时,将自己的即时窗口大小填入,并跟随ACK报文一起发送过去。
      • 发送方根据ACK报文里的窗口大小的值的改变进而改变自己的发送速度。
      • 如果接收到窗口大小的值为0,那么发送方将停止发送数据,并定期的向接收端发送窗口探测数据段,让接收端把窗口大小告诉发送端。
  • 拥塞控制 **
    • TCP传输的过程中,发送端开始发送数据的时候,如果刚开始就发送大量的数据,那么就可能造成一些问题。网络可能在开始的时候就很拥堵,如果给网络中在扔出大量数据,那么这个拥堵就会加剧。拥堵的加剧就会产生大量的丢包,就对大量的超时重传,严重影响传输。
    • 因此TCP引入了慢启动的机制,在开始发送数据时,先发送少量的数据探路。探清当前的网络状态如何,再决定多大的速度进行传输。这时候就引入一个叫做拥塞窗口的概念。
    • 发送刚开始定义拥塞窗口为 1,每次收到ACK应答,拥塞窗口加 1。在发送数据之前,首先将拥塞窗口与接收端反馈的窗口大小比对,取较小的值作为实际发送的窗口。
    • 拥塞窗口的增长是指数级别的。慢启动的机制只是说明在开始的时候发送的少,发送的慢,但是增长的速度是非常快的。

Tcp有哪些状态

  • LISTEN - 侦听来自远方TCP端口的连接请求;
  • SYN-SENT -在发送连接请求后等待匹配的连接请求;
  • SYN-RECEIVED - 在收到和发送一个连接请求后等待对连接请求的确认;
  • ESTABLISHED- 代表一个打开的连接,数据可以传送给用户;
  • FIN-WAIT-1 - 等待远程TCP的连接中断请求,或先前的连接中断请求的确认;
  • FIN-WAIT-2 - 从远程TCP等待连接中断请求;
  • CLOSE-WAIT - 等待从本地用户发来的连接中断请求;
  • CLOSING -等待远程TCP对连接中断的确认;
  • LAST-ACK - 等待原来发向远程TCP的连接中断请求的确认;
  • TIME-WAIT -等待足够的时间以确保远程TCP接收到连接中断请求的确认;
  • CLOSED - 没有任何连接状态;

面试题:Tcp怎么保证顺序*

见上方保证可靠性的序列号

面试题:TCP优化

  • TCP的快速打开
    • 允许TCP在连接建立握手阶段交换数据
  • 尽最大重用建立的TCP连接
    • 长连接
    • 负载均衡
      • 客户端(如:ClientA)与负载均衡设备之间进行三次握手并发送 HTTP 请求。负载均衡设备收到请求后,会检测服务器是否存在空闲的长链接,如果不存在,服务器将建立一个新连接。当 HTTP 请求响应完成后,客户端与负载均衡设备协商关闭连接,而负载均衡则保持与服务器之间的这个连接。当有其他客户端(如:ClientB)需要发送 HTTP 请求时,负载均衡设备会直接向服务器之间保持的这个空闲连接发送 HTTP 请求,避免来由于新建 TCP 连接造成的延时和服务器资源耗费。

面试题:什么是TCP 粘包/拆包

操作系统在发送TCP数据的时候,底层会有一个缓冲区

  • 拆包:
    • 一次发送的数据如果超过缓冲区的大小,那么一个完整的数据包可能就被拆分成多个子包进行发送
  • 粘包:
    • 一次发送的数据如果达不到缓冲区的大小,那么多个子数据可能就被封装成一个大的数据包进行发送

后言

以上就是八股文之网络编程的全部内容了,希望对大家有一定的帮助,我是新生代农民工L_Denny,下篇文章说说我对Netty的了解,再见。