C++常见面试问题汇总6——计算机网络

  • 请你说一说TCP的三次握手和四次挥手的过程及原因

TCP建立连接和断开连接的过程:

C++常见面试问题汇总6——计算机网络

C-> SYN -> S

S->SYN/ACK->C

C->ACK->S

三次握手的原因:三次握手可以防止已经失效的连接请求报文突然又传输到服务器端导致的服务器资源浪费。例如,客户端先发送了一个SYN,但是由于网络阻塞,该SYN数据包在某个节点长期滞留。然后客户端又重传SYN数据包并正确建立TCP连接,然后传输完数据后关闭该连接。该连接释放后失效的SYN数据包才到达服务器端。在二次握手的前提下,服务器端会认为这是客户端发起的又一次请求,然后发送SYN ,并且在服务器端创建socket套接字,一直等待客户端发送数据。但是由于客户端并没有发起新的请求,所以会丢弃服务端的SYN 。此时服务器会一直等待客户端发送数据从而造成资源浪费。

TCP的四次挥手过程如下:

C->FIN->S

S->ACK->C

S->FIN->C

C->ACK->S

四次挥手的原因:由于连接的关闭控制权在应用层,所以被动关闭的一方在接收到FIN包时,TCP协议栈会直接发送一个ACK确认包,优先关闭一端的通信。然后通知应用层,由应用层决定什么时候发送FIN包。应用层可以使用系统调用函数read==0来判断对端是否关闭连接。

 

  •  请问tcp握手为什么两次不可以?为什么不用四次?

两次不可以:tcp是全双工通信,两次握手只能确定单向数据链路是可以通信的,并不能保证反向的通信正常

不用四次:
本来握手应该和挥手一样都是需要确认两个方向都能联通的,本来模型应该是:
1.客户端发送syn0给服务器
2.服务器收到syn0,回复ack(syn0+1)
3.服务器发送syn1
4.客户端收到syn1,回复ack(syn1+1)
因为tcp是全双工的,上边的四部确认了数据在两个方向上都是可以正确到达的,但是2,3步没有没有上下的联系,可以将其合并,加快握手效率,所有就变成了3步握手。

  • TCP和UDP的区别和各自适用的场景

  • 1)TCP和UDP区别

  • 1) 连接

TCP是面向连接的传输层协议,即传输数据之前必须先建立好连接。

UDP无连接。

  • 2) 服务对象

TCP是点对点的两点间服务,即一条TCP连接只能有两个端点;

UDP支持一对一,一对多,多对一,多对多的交互通信。

  • 3) 可靠性

TCP是可靠交付:无差错,不丢失,不重复,按序到达。

UDP是尽最大努力交付,不保证可靠交付。

  • 4)拥塞控制,流量控制

TCP有拥塞控制和流量控制保证数据传输的安全性。

UDP没有拥塞控制,网络拥塞不会影响源主机的发送效率。

  • 5) 报文长度

TCP是动态报文长度,即TCP报文长度是根据接收方的窗口大小和当前网络拥塞情况决定的。

UDP面向报文,不合并,不拆分,保留上面传下来报文的边界。

  • 6)   首部开销

TCP首部开销大,首部20个字节。

UDP首部开销小,8字节。(源端口,目的端口,数据长度,校验和)

  • 2)TCP和UDP适用场景

从特点上我们已经知道,TCP 是可靠的但传输速度慢,UDP 是不可靠的但传输速度快。因此在选用具体协议通信时,应该根据通信数据的要求而决定。

若通信数据完整性需让位与通信实时性,则应该选用TCP 协议(如文件传输、重要状态的更新等);反之,则使用 UDP 协议(如视频传输、实时通信等)。

 请你来说一下socket编程中服务器端和客户端主要用到哪些函数

  • 1)基于TCP的socket:

1、服务器端程序:

1创建一个socket,用函数socket()

2绑定IP地址、端口等信息到socket上,用函数bind()

3设置允许的最大连接数,用函数listen()

4接收客户端上来的连接,用函数accept()

5收发数据,用函数send()和recv(),或者read()和write()

6关闭网络连接

2、客户端程序:

1创建一个socket,用函数socket()

2设置要连接的对方的IP地址和端口等属性

3连接服务器,用函数connect()

4收发数据,用函数send()和recv(),或read()和write()

5关闭网络连接

C++常见面试问题汇总6——计算机网络

  • 2)基于UDP的socket:

1、服务器端流程

1建立套接字文件描述符,使用函数socket(),生成套接字文件描述符。

2设置服务器地址和侦听端口,初始化要绑定的网络地址结构。

3绑定侦听端口,使用bind()函数,将套接字文件描述符和一个地址类型变量进行绑定。

4接收客户端的数据,使用recvfrom()函数接收客户端的网络数据。

5向客户端发送数据,使用sendto()函数向服务器主机发送数据。

6关闭套接字,使用close()函数释放资源。UDP协议的客户端流程

2、客户端流程

1建立套接字文件描述符,socket()。

2设置服务器地址和端口,struct sockaddr。

3向服务器发送数据,sendto()。

4接收服务器的数据,recvfrom()。

5关闭套接字,close()。

C++常见面试问题汇总6——计算机网络

 请回答一下HTTP和HTTPS的区别,以及HTTPS有什么缺点?

  • HTTP协议和HTTPS协议区别如下:

1)HTTP协议是以明文的方式在网络中传输数据,而HTTPS协议传输的数据则是经过TLS加密后的,HTTPS具有更高的安全性

2)HTTPS在TCP三次握手阶段之后,还需要进行SSL 的handshake,协商加密使用的对称加***

3)HTTPS协议需要服务端申请证书,浏览器端安装对应的根证书

4)HTTP协议端口是80,HTTPS协议端口是443

  • HTTPS优点:

HTTPS传输数据过程中使用**进行加密,所以安全性更高

HTTPS协议可以认证用户和服务器,确保数据发送到正确的用户和服务器

  • HTTPS缺点:

HTTPS握手阶段延时较高:由于在进行HTTP会话之前还需要进行SSL握手,因此HTTPS协议握手阶段延时增加

HTTPS部署成本高:一方面HTTPS协议需要使用证书来验证自身的安全性,所以需要购买CA证书;另一方面由于采用HTTPS协议需要进行加解密的计算,占用CPU资源较多,需要的服务器配置或数目高

请你说一说HTTP和HTTPS的不同

  • HTTP协议和HTTPS协议区别如下:

1)HTTP协议是以明文的方式在网络中传输数据,而HTTPS协议传输的数据则是经过TLS加密后的,HTTPS具有更高的安全性

2)HTTPS在TCP三次握手阶段之后,还需要进行SSL 的handshake,协商加密使用的对称加***

3)HTTPS协议需要服务端申请证书,浏览器端安装对应的根证书

4)HTTP协议端口是80,HTTPS协议端口是443

请你说一说TCP拥塞控制?以及达到什么情况的时候开始减慢增长的速度?

拥塞控制是防止过多的数据注入网络,使得网络中的路由器或者链路过载。流量控制是点对点的通信量控制,而拥塞控制是全局的网络流量整体性的控制。发送双方都有一个拥塞窗口——cwnd。

1、慢开始

最开始发送方的拥塞窗口为1,由小到大逐渐增大发送窗口和拥塞窗口。每经过一个传输轮次,拥塞窗口cwnd加倍。当cwnd超过慢开始门限,则使用拥塞避免算法,避免cwnd增长过大。

2、拥塞避免

每经过一个往返时间RTT,cwnd就增长1。

在慢开始和拥塞避免的过程中,一旦发现网络拥塞,就把慢开始门限设为当前值的一半,并且重新设置cwnd为1,重新慢启动。(乘法减小,加法增大)

3、快重传

接收方每次收到一个失序的报文段后就立即发出重复确认,发送方只要连续收到三个重复确认就立即重传(尽早重传未被确认的报文段)。

4、快恢复

当发送方连续收到了三个重复确认,就乘法减半(慢开始门限减半),将当前的cwnd设置为慢开始门限,并且采用拥塞避免算法(连续收到了三个重复请求,说明当前网络可能没有拥塞)。

 

采用快恢复算法时,慢开始只在建立连接和网络超时才使用。

  • 达到什么情况的时候开始减慢增长的速度?

采用慢开始和拥塞避免算法的时候

1. 一旦cwnd>慢开始门限,就采用拥塞避免算法,减慢增长速度

2. 一旦出现丢包的情况,就重新进行慢开始,减慢增长速度

采用快恢复和快重传算法的时候

1. 一旦cwnd>慢开始门限,就采用拥塞避免算法,减慢增长速度

2. 一旦发送方连续收到了三个重复确认,就采用拥塞避免算法,减慢增长速度