计算机网络-面试篇

计算机网络-面试篇

Q1:TCP中的序号和确认号的关系?

TCP报文段首部中的序号字段和确认号字段是最重要的两个字段,是TCP可靠传输的服务的关键部分。是TCP为了保证TCP的可靠传输,采用累计确认技术,这就要用到确认号了。

  • 序列号:是该报文段首字节的字节流编号(不是全部传递哦),TCP会给每一个字节分配一个序列号;
  • 确认号:是期望接收的字节编号(32位),若确认号为500,则表示接收到了499,498,…,下一次发方就可以从字节序列号为500的字节开始发数据。

注意:TCP只确认对应流中第一个丢失字节为止的字节。即hostA以收到hostB发送分别包含字节0-100和200-300的两个报文段,由于某种原因字节序号为101-199的报文段hostB没有接收到,那么hostA为了重新构建主机hostB的数据流,仍在等待字节序号为101(和之和的字节)。


Q2:TCP中滑动窗口?

窗口位于TCP报文段中的首部,16比特位,接收方允许对方发送是数据量。用于限制流量控制,表示接收方愿意接收的字节数列。


Q3:SYN洪泛?怎么解决

SYN洪泛攻击发生TCP三次握手的时候,攻击者发送TCP SYN,SYN是TCP三次握手中的第一个数据包,而当服务器返回ACK后(以及在服务器中分配对应的缓存和变量了),该攻击者不在对其进行确认,那么服务器这边对应的TCP连接就处于挂起状态,也称半连接状态,服务器收不再次确认的的就会重复发送ACK给攻击者。这样会浪费服务器的资源。当攻击者向服务器发送了大量的TCP SYN请求后,由于每一次连接都处于半连接状态,这些TCP连接就会消耗CPU和内存,最终可能导致服务器宕机,无法为用户提供服务。(在一段时间内有可恢复,无效连接自动释放)


Q4:TCP三次握手时,客户端为什么最后还有发送一次确认,如果是两次握手会怎么样?

3次握手完成保证双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在三次握手过程中被发送和确认。


Q5:TCP三次连接以后不发送数据会发生上面?如果已经建立了连接,但是客户端突然出现故障了怎么办?

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


Q6:为什么最后要等一个TIME_WAIT时间呢?

保证TCP协议的全双工连接能够可靠关闭。如果Client直接CLOSED了,那么由于IP协议的不可靠性或者是其它网络原因,导致Server没有收到Client最后回复的ACK。那么Server就会在超时之后继续发送FIN,此时由于Client已经CLOSED了,就找不到与重发的FIN对应的连接,最后Server就会收到RST而不是ACK,Server就会以为是连接错误把问题报告给高层。这样的情况虽然不会造成数据丢失,但是却导致TCP协议不符合可靠连接的要求。所以,Client不是直接进入CLOSED,而是要保持TIME_WAIT,当再次收到FIN的时候,能够保证对方收到ACK,最后正确的关闭连接。

保证这次连接的重复数据段从网络中消失。如果Client直接CLOSED,然后又再向Server发起一个新连接,我们不能保证这个新连接与刚关闭的连接的端口号是不同的。也就是说有可能新连接和老连接的端口号是相同的。一般来说不会发生什么问题,但是还是有特殊情况出现:假设新连接和已经关闭的老连接端口号是一样的,如果前一次连接的某些数据仍然滞留在网络中,这些延迟数据在建立新连接之后才到达Server,由于新连接和老连接的端口号是一样的,又因为TCP协议判断不同连接的依据是socket pair,于是,TCP协议就认为那个延迟的数据是属于新连接的,这样就和真正的新连接的数据包发生混淆了。所以TCP连接还要在TIME_WAIT状态等待2倍MSL,这样可以保证本次连接的所有数据都从网络中消失。


Q7:为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。

Q8.为什么TCP握手需要三次?

TCP是可靠的传输控制协议,三次握手能保证数据可靠传输又能提高传输效率。

如果TCP的握手是两次:

  • 如果client发给server的SYN报文因为网络原因,延迟发送。由于client没有收到server对SYN的确认报文,会重发SYN报文,服务器和回复ACK,连接建立。数据发送完毕,这条连接被正常关闭。这时,延迟的SYN报文发到了server,server误以为这是client重新发送的同步报文,又回复了一个ACK,和client建立了连接。
  • 如果server给client发送的ACK报文因为网络原因,报文被丢弃,此时server认为已经建立好连接,但是client没有收到确认报文,认为没有建立好连接。client会重发SYN报文,此时server已经处于就绪状态,认为已经建立好连接。

如果TCP的握手是四次:

  1. client给server发送SYN同步报文;
  2. server收到SYN后,给client回复ACK确认报文;
  3. server给client发送SYN同步报文;
  4. client给server发送ACK确认报文。

送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。

Q8.为什么TCP握手需要三次?

TCP是可靠的传输控制协议,三次握手能保证数据可靠传输又能提高传输效率。

如果TCP的握手是两次:

  • 如果client发给server的SYN报文因为网络原因,延迟发送。由于client没有收到server对SYN的确认报文,会重发SYN报文,服务器和回复ACK,连接建立。数据发送完毕,这条连接被正常关闭。这时,延迟的SYN报文发到了server,server误以为这是client重新发送的同步报文,又回复了一个ACK,和client建立了连接。
  • 如果server给client发送的ACK报文因为网络原因,报文被丢弃,此时server认为已经建立好连接,但是client没有收到确认报文,认为没有建立好连接。client会重发SYN报文,此时server已经处于就绪状态,认为已经建立好连接。

如果TCP的握手是四次:

  1. client给server发送SYN同步报文;
  2. server收到SYN后,给client回复ACK确认报文;
  3. server给client发送SYN同步报文;
  4. client给server发送ACK确认报文。

第2.3步之间,server和client没有任何的数据交互,分开发送相当于多发了一次TCP报文段,SYN和ACK标识只是TCP报头的一个标识位。很明显,这两步可以合并,从而提高连接的速度和效率。

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