网络编程面试题

文章目录

1.网络协议有哪些?OSI协议七层结构每一层的作用?分别都对应哪些协议?

a. 常见的网络协议

  • TCP(Transport Control Protocol):传输控制协议

  • IP(Internet Protocol):Internet协议

  • UDP(User Datagram Protocol):用户数据包协议,它和TCP一样位于传输层,和IP协议配合使用,在传输数据时省去包头,但它不能提供数据包的重传,所以适合传输较短的文件。

  • FTP(File Transfer Protocol):远程文件传输协议,允许用户将远程主机上的文件拷贝到自己的计算机上。

  • SMTP(Simple Mail transfer Protocol):简单邮政传输协议,用于传输电子邮件。

  • NFS(Network File Server):网络文件服务器,可使多台计算机透明地访问彼此的目录。

b. OSI协议七层结构每一层的作用

  • 物理层:通过媒介传输比特,确定机械及电器规范(比特Bit)

  • 数据链路层:将比特装饰成帧和点到点的传输(帧Frame)

  • 网络层:负责数据包从源到宿的传递和网际互连(包Packet)

  • 传输层:提供端到端的可靠报文的传递和错误恢复(段Segment)

  • 会话层:建立、管理和终止会话(会话协议数据单元SPDU)

  • 表示层:对数据进行翻译。加密和压缩(表示协议数据单元PPDU)

  • 应用层:允许访问OSI环境的手段(应用协议数据单元APDU)

c. 分别都对应的协议

网络编程面试题


2.TCP的三次握手

  • 默认情况下客户端client服务端sever的TCP进程都处于CLOSED(关闭)状态
  • 服务端TCP服务进程先建立传输控制块TCB,然后服务端进入LISTEN状态,等待客户端连接请求。

网络编程面试题

  • 第一次握手:客户端TCP进程也先建立传输控制块TCB,然后向服务端发送连接请求报文段,此时SYN=1,随机选定一个初始序号seq=x,,此报文不能携带数据,但是要消耗掉一个序号,发送完毕后,客户端进入SYN-SENT(同步已发送)状态

  • 第二次握手:服务端收到客户端请求连接报文段后,若同意建立连接,则发送确认报文,确认报文中SYN=1、ACK=1,确认号ack=x+1,同时随机选定一个自己序号seq=y,确认报文段同样不能携带数据,但是也要消耗掉一个序号,发送完毕后服务端进入SYN-RCVD(同步收到)状态

  • 第三次握手:客户端收到确认报文后,检查ACK=1,ack=x+1是否正确,若正确,则向服务端发送确认报文,确认报文中ACK=1,ack=y+1,seq=x+1,发送后进入ESTAB-LISHED状态,服务端收到确认报文后,也进入ESTAB-LISHED状态,此时双方TCP连接正式建立。

上面的连接建立过程就是TCP三次握手。


3.TCP为什么是三次握手?

  • 为了防止已失效的连接请求报文段突然又送到了Server端。
  • 解释:

-假设现在TCP连接是两次握手机制,如下图server在收到client的连接请求,确认后就进入ESTAB-LISHED状态,
会存在这样一种问题:

client发送连接请求报文,由于网络原因,长时间阻塞在某个网络节点上了,于是client重传了一次请求连接报文,第二次请求报文正常达到server,连接正常建立,数据传输完毕后,释放连接。但是假设此时第一次发送的请求报文并没有丢失,而是延误一段时间才到达server,这本是已失效的连接请求报文段,但是server收到后,会以为是client重新发送的连接请求,于是向client发送确认报文后,进入ESTAB-LISHED状态,但是client并没有发出新建连接的请求,就会忽略server的确认报文,server却在一直等待client发送数据,导致server资源浪费严重。


4.TCP的四次挥手

TCP四次挥手指的是TCP连接释放过程, 不同于TCP连接建立时的三次握手过程,TCP连接释放过程更加复杂。TCP协议的两个重要特点:

  • TCP协议面向连接:应用在使用TCP协议通讯时,必须要先建立TCP连接。
  • TCP连接是双向通信:通信的两端是对等的,既能发送数据,也能接收数据,就向我们打电话时一样,既能说也能听。

这两个重要特点决定了TCP连接的释放过程。

网络编程面试题
TCP连接数据传输结束后,通信的双方client与server都可以选择释放当前TCP连接,此时client与server都处于ESTABLISHED(连接确立)状态,TCP连接释放从此状态开始,我们假设是client的应用进程主动发起TCP连接释放:

  • 第一次挥手client向server主动发送连接释放报文FIN=1,seq=u),报文的首部控制位FIN=1,代表自己的数据已经发送完毕,并且要求释放TCP连接。序号seq=u,u的值为client前面已传送数据的最后一个字节序号加1,client发送完后进入FIN-WAIT-1(终止等待1)状态。

  • 第二次挥手:server收到client的连接释放报文后即给出确认报文(ACK=1,ack=u+1,seq=v),序号seq=v,值为server前面已传送数据的最后一个字节序号加1,然后server进入CLOSE-WAIT(关闭等待)状态这时候client到server这个方向连接就释放了,TCP连接处于 半关闭(half-close)状态client不再发送数据,但是server仍然可以发送数据给client。client收到server确认后进入FIN-WAIT-2(终止等待2)状态,然后等待server发出连接释放报文

  • 第三次挥手:处于CLOSE-WAIT状态的server发送完所有数据后,主动释放连接,server发送的连接释放报文FIN=1,ACK=1,seq=W,ack=u+1),因为半关闭状态,server可能又发送了一些数据,所以序号的值为W,同时保持确认号ack=U+1与上次一致,发送完毕后,server进入LAST-ACK(最后确认)状态,等待client确认。

  • 第四次挥手client收到server连接释放报文后,给出确认报文(ACK=1,ack=w+1,seq=u+1),此时连接还没释放掉,client要时间等待计时器设置的2MSL的时间,才最终进入CLOSED状态。时间MSL是最长报文寿命时长,RFC793建议为2分钟,但是现在网络中,这个时间设置更小。也就是说client要等待4分钟才能进入CLOSED状态,开始下一个连接。


5.为什么client在TIME-WAIT状态必须等待2MSL的时间?

  • 为了保证client的最后发送的ACK报文能到达server。因为这个ACK报文可能丢失,导致处于LAST-ACK状态的server收不到对自己释放连接报文的确认。若是server超时重传了这个报文,client就能在2MSL时间内收到,并且重新一次确认,并重启2MSL计时器。

  • 防止出现“已失效的连接请求报文段”出现,2MSL时间,可以使本连接持续时间内的报文段都从网络中消失。建立下一个TCP连接时就不会出现上次旧连接请求报文段


6.TCP握手以及每一次握手客户端和服务器端处于哪个状态(Socket 的11种状态)

  • CLOSED:表示初始状态

  • LISTEN:该状态表示服务器端的某个SOCKET处于监听状态,可以接受连接。

  • SYN_SENT:这个状态与SYN_RCVD遥相呼应,当客户端SOCKET执行CONNECT连接时,它首先发送SYN报文,随即进入到了SYN_SENT状态,并等待服务端的发送三次握手中的第2个报文。SYN_SENT状态表示客户端已发送SYN报文。

  • SYN_RCVD:该状态表示接收到SYN报文,在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂。此种状态时,当收到客户端的ACK报文后,会进入到ESTABLISHED状态。

  • ESTABLISHED:表示连接已经建立。

  • FIN_WAIT_1: FIN_WAIT_1和FIN_WAIT_2状态的真正含义都是表示等待对方的FIN报文。区别是:

    FIN_WAIT_1状态是当socket在ESTABLISHED状态时,想主动关闭连接,向对方发送了FIN报文,此时该socket进入到FIN_WAIT_1状态。
    -FIN_WAIT_2状态是当对方回应ACK后,该socket进入到FIN_WAIT_2状态,正常情况下,对方应马上回应ACK报文,所以FIN_WAIT_1状态一般较难见到,而FIN_WAIT_2状态可用netstat看到。

  • FIN_WAIT_2主动关闭链接的一方,发出FIN收到ACK以后进入该状态。称之为半连接或半关闭状态。该状态下的socket只能接收数据,不能发。

  • TIME_WAIT:表示收到了对方的FIN报文并发送出了ACK报文等2MSL后即可回到CLOSED可用状态。如果FIN_WAIT_1状态下,收到对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。

  • CLOSING: 这种状态较特殊,属于一种较罕见的状态。正常情况下,当你发送FIN报文后,按理来说是应该先收到(或同时收到)对方的 ACK报文,再收到对方的FIN报文。但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什么情况下会出现此种情况呢?如果双方几乎在同时close一个SOCKET的话,那么就出现了双方同时发送FIN报文的情况,也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接。

  • CLOSE_WAIT: 此种状态表示在等待关闭。当对方关闭一个SOCKET后发送FIN报文给自己,系统会回应一个ACK报文给对方,此时则进入到CLOSE_WAIT状态。接下来呢,察看是否还有数据发送给对方,如果没有可以 close这个SOCKET,发送FIN报文给对方,即关闭连接。所以在CLOSE_WAIT状态下,需要关闭连接

  • LAST_ACK: 该状态是被动关闭一方在发送FIN报文后,最后等对方的ACK报文。收到ACK报文后,即可以进入到CLOSED可用状态。


每日更新…

上一篇:C++ Primer Plus【复习笔记】-【分支语句和逻辑运算符】


下一篇:Python面试5