C++面试最常见问题(四)——网络编程部分

系列文章目录

#C++面试最常见问题(一)

#C++面试最常见问题(二)

#C++面试最常见问题(三)

文章目录

  • 系列文章目录
  • 一、OSI七层模型是什么?每层主要完成什么任务?
  • 二、简述三次握手和四次挥手
  • 三、TCP和UDP是什么,它们之间有什么联系和区别?
  • 四、TCP、UDP使用场景
  • 五、TCP如何维护可靠的通信方式?
  • 六、TCP中三次握手可以变为两次握手么?
  • 七、UDP如何实现可靠性传输?
  • 八、什么十tcp粘包问题?如何解决?
  • 九、简述socket通信的基本步骤
  • 十、http和https分别是什么?他们的区别是什么?

一、OSI七层模型是什么?每层主要完成什么任务?

OSI七层模型自上而下分别是应用层、表示层、会话层、运输层、网络层、数据链路层和物理层。
每层的作用是:
应用层:通过应用进程之间的交互来往成特定的网络应用。
表示层:解决通信双方交换信息的表示问题。
会话层:解决进程间会话问题。
运输层:解决进程之间基于网络通信的问题。
网络层:分组在多个网络上传输的问题。
数据链路层:分组在一段链路上的传输问题。
物理层:使用何种信号进行传输的问题。

二、简述三次握手和四次挥手

(1)TCP三次握手

第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

(2)TCP四次挥手

1)客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。
2)服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了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(时间等待)状态。
6)服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。

(3)连接的时候是三次握手,关闭的时候却是四次握手的原因

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

三、TCP和UDP是什么,它们之间有什么联系和区别?

TCP:
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
UDP:
Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。
TCP与UDP区别总结:

(1)TCP面向连接,通过三次握手建立连接,四次挥手接除连接;UDP是无连接的,即发送数据之前不需要建立连接,这种方式为UDP带来了高效的传输效率,但也导致无法确保数据的发送成功。
(2)TCP是可靠的通信方式。通过TCP连接传送的数据,TCP通过超时重传、 数据校验等方式来确保数据无差错,不丢失,不重复,且按序到达;而UDP由于无需连接的原因,将会以最大速度进行传输,但不保证可靠交付,也就是会出现丢失、重复等等问题。
(3)TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流,由于连接的问题,当网络出现波动时,连接可能出现响应问题;UDP是面向报文的,UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低。
(4)每一条TCP连接只能是点到点的;而UDP不建立连接,所以可以支持一对一,一对多,多对一和多对多的交互通信,也就是可以同时接受多个人的包。
(5)TCP需要建立连接,首部开销20字节相比8个字节的UDP显得比较大。
(6)TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道。

四、TCP、UDP使用场景

UDP 使用场景:
因此UDP不提供复杂的控制机制,利用IP提供面向无连接的通信服务,随时都可以发送数据,处理简单且高效。所以主要使用在以下场景:
(1)包总量较小的通信(DNS、SNMP)
(2)视频、音频等多媒体通信(即时通信)
(3)QQ就是使用的UDP协议。
(4)广播通信

注:主要是一切追求速度的场景上

TCP 使用场景:
TCP 使用场景:相对于 UDP,TCP 实现了数据传输过程中的各种控制,可以进行丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。在对可靠性要求较高的情况下,可以使用 TCP,即不考虑 UDP 的时候,都可以选择 TCP。

注:特别是需要可靠连接,比如付费、加密数据等等方向都需要依靠TCP.

五、TCP如何维护可靠的通信方式?

(1)数据分片:在发送端对用户数据进行分片,在接收端进行重组,由TCP确定分片的大小并控制分片和重组;
(2)到达确认:接收端接收到分片数据时,根据分片数据序号向发送端发送一个确认包;
(3)超时重发:发送方在发送分片后计时,若超时却没有收到相应的确认包,将会重发对应的分片;
(4)滑动窗口:TCP连接双方的接收缓冲空间大小都固定,接收端只能接受缓冲区能接纳的数据。
(5)失序处理:TCP的接收端需要重新排序接收到的数据。
(6)重复处理:如果传输的TCP分片出现重复,TCP的接收端需要丢弃重复的数据。
(7)数据校验:TCP通过保持它首部和数据的检验和来检测数据在传输过程中的任何变化。

六、TCP中三次握手可以变为两次握手么?

不可以。
首先,TCP 是全双工通信,而且 TCP 是通过序列号来实现可靠传输的,因此一个连接首先要同步双方起始序列号(ISN),才可以保证通信双方的数据准确性;而ISN 的生成规则告诉我们只有生成 ISN 的一方才可以确认这个 ISN 是不是正确的,因此,需要三次握手来保证通信双方 ISN 的同步,如果只有两次握手,只能保证发起方的ISN 被确认,也就只能保证发起方向服务方的单向通信的数据可靠性。
此外,TCP 还利用 ISN 在三次握手的过程中解决了历史连接初始化带来的数据混乱问题。

七、UDP如何实现可靠性传输?

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

八、什么十tcp粘包问题?如何解决?

TCP粘包就是指发送方发送的若干包数据到达接收方时粘成了一包,从接收缓冲区来看,后一包数据的头紧接着前一包数据的尾,出现粘包的原因是多方面的,可能是来自发送方,也可能是来自接收方。
1)发送方

对于发送方造成的粘包问题,可以通过关闭Nagle算法来解决,使用TCP_NODELAY选项来关闭算法。

(2)接收方

接收方没有办法来处理粘包现象,只能将问题交给应用层来处理。

(2)应用层

应用层的解决办法简单可行,不仅能解决接收方的粘包问题,还可以解决发送方的粘包问题。

解决办法:循环处理,应用程序从接收缓存中读取分组时,读完一条数据,就应该循环读取下一条数据,直到所有数据都被处理完成,但是如何判断每条数据的长度呢?

格式化数据:每条数据有固定的格式(开始符,结束符),这种方法简单易行,但是选择开始符和结束符时一定要确保每条数据的内部不包含开始符和结束符。
发送长度:发送每条数据时,将数据的长度一并发送,例如规定数据的前4位是数据的长度,应用层在处理时可以根据长度来判断每个分组的开始和结束位置。

九、简述socket通信的基本步骤

具体分成两个部分:

(1)服务端
1)socket(创建socket)
2)bind(绑定socket和端口号)
3)listen(监听该端口号)
4)accept(等待并接受客户端连接请求)
5)read,write(读取数据和返回数据)
6)close(关闭socket)

(2)客户端
1)socket(创建socket)
2)connect(连接指定的端口)
3)read,write(读取数据和返回数据)
4)close(关闭socket)

十、http和https分别是什么?他们的区别是什么?

HTTP:超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。设计 HTTP 最初的目的是为了提供一种发布和接收 HTML 页面的方法。它可以使浏览器更加高效。HTTP 协议是以明文方式发送信息的,如果黑客截取了 Web 浏览器和服务器之间的传输报文,就可以直接获得其中的信息。

HTTP 原理:
1)客户端的浏览器首先要通过网络与服务器建立连接,该连接是通过 TCP 来完成的,一般 TCP 连接的端口号是80。 建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URI)、协议版本号,后边是 MIME 信息包括请求修饰符、客户机信息和许可内容。
2)服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是 MIME 信息包括服务器信息、实体信息和可能的内容。
HTTPS:是以安全为目标的 HTTP 通道,是 HTTP 的安全版。HTTPS 的安全基础是 SSL。SSL 协议位于 TCP/IP 协议与各种应用层协议之间,为数据通讯提供安全支持。SSL 协议可分为两层:SSL 记录协议(SSL Record Protocol),它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。SSL 握手协议(SSL Handshake Protocol),它建立在 SSL 记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。

二者的区别:

1、HTTPS 协议需要到 CA (Certificate Authority,证书颁发机构)申请证书,一般免费证书较少,因而需要一定费用。(以前的网易官网是http,而网易邮箱是 https 。

2、HTTP 是超文本传输协议,信息是明文传输,HTTPS 则是具有安全性的 SSL 加密传输协议。

3、HTTP 和 HTTPS 使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

4、HTTP 的连接很简单,是无状态的。HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全。(无状态的意思是其数据包的发送、传输和接收都是相互独立的。无连接的意思是指通信双方都不长久的维持对方的任何信息。)


你可能感兴趣的:(c++计算机网络,面试,c++,网络)