C++常见面试题 | Day8

1、OSI七层网络模型

OSI七层网络模型包括物理层、数据链路层、网络层、传输层、会话层、表示层、应用层;

应用层:应用层为网络体系最高层,也是唯一面向用户的一层,也可以视为为用户提供常用的应用程序,每个网络都对应着不同的协议;HTTP、TFTP、FTP、SMTP等;

表示层:数据编码和转化,以确保以一个系统应用层发送的信息可以被另一个系统应用层识别;JPEG、GIF、TIFF等;

会话层 :建立、管理、终止会话。对应主机进程,指本地主机与远程主机正在进行的会话,ssl,tls就是在这一层进行;RPC、SQL、APPLETALK等;

传输层:建立、维护和管理端到端的连接,控制数据传输方式;TCP、UDP;

网络层:进行逻辑地址寻址,实现不同网络之间的路径选择。数据传输线路选择,IP地址及路由选择;IP、ICMP、ARP、UUCP等;

数据链路层:是以太网所在的层,进行物理寻址;MAC、ARP等;

物理层:确保原始的数据可以在各种物理媒体上传输,主要是物理介质传输媒介;

物理层对应的物理实体就是网线,水晶头;数据链路层对应的物理实体就是交换机,网络层对应的是路由器;一个数据包从一个主机发送 出来,经过网线水晶头(物理层),再经过交换机(数据链路层),然后通过路由器(网络层),到达另一个主机,之后,这和数据包将离开物理硬件,用tcp或者udp进行传输(传输层),然后两个主机开始建立会话并管理会话(会话层),然后解决不同系统之间的识别编码问题(表示层),最后到达应用(应用层)来处理这个数据包。

2、三次握手和四次挥手

建立连接三次握手:

1)第一次握手:建立连接时,客户端发送syn(syn=x)包到服务器,并进入SYN_SENT状态,等待服务器确认;

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

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

C++常见面试题 | Day8

断开连接四次挥手:

1)客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号+1),此时,客户端进入FIN_WAIT_1(中止等待1)状态;

2)服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并带上自己的序列号seq=v,此时,服务器端进入了CLOSE_WAIT(关闭等待)状态。确保客户端没有数据要发送;客户端在收到服务器的确认请求后,此时,客户端就进入FIN_WAIT_2(终止等待2)状态,等待服务器发送连接释放报文;

3)服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,seq=w,此时服务器进入LAST_ACK(最后确认)状态,等待客户端的确认;

4)客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,自己的序列号seq=u+1,此时,客户端就进入了TIME_WAIt(时间等待)状态。等待2个MSL(最长报文段寿命)时间后,当客户端撤销相应的TCB后,才进入CLOSED状态,服务器只要收到客户端发出的确认,立刻进入CLOSED状态。

 

C++常见面试题 | Day8

 

3、为什么连接时是三次握手,关闭的时候确是四次握手?

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

4、为什么TIME_WAIT状态需要经过2MSL(最大报文生存时间)才能返回到CLOSED状态?

按道理,四个保温都发送完毕我们就可以进入CLOSE状态,但是我们必须要假想网络是不可靠的,有可能最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文,在客户端送出最后的ACK回复,但该ACK可能丢失,服务端如果没有收到ACK,将不断重复发送FIN片段。所以客户端不能立即关闭,他必须确认服务端收到了该ACK。客户端在发送出ACK之后进入到了TIME_WAIT状态。客户端会设置一个计时器,等待2MSL的时间,如果在该时间段内再次收到FIN,那么客户端会重发ACK并再次等待2MSL,所谓2MSL时两倍的最大报文生存时间。MSL是指一个片段在网络中最大的存活时间,如果直到2MSL,客户端都没有再此收到FIN,那么客户端推断ACK被成功接收,则结束TCP连接。

5、为什么不能两次握手进行连接?

3次握手完成两个重要的功能,既要双方都做好发送数据的准备工作,也需要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。如果把三次握手改成两次握手,会造成资源浪费,如果采用两次握手,第一次的请求连接丢失,那么在结束传输后,服务器收到了第一次连接丢失的请求,便会在再次建立连接,而此时已经不需要传输数据,会造成资源浪费;容易发生死锁,考虑计算机客户端和服务端之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发送了确认应答分组。按照两次握手的协定,S认为连接已经成功建立了,可以开始发送数据分组,可是,C在S的应答分组在传输中被丢失的情况下,将不知道S是否已经准备好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。

6、如果已经建立了连接,但是客户端出现了故障怎么办?

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

上一篇:day8


下一篇:day8-字符串