TCP和UDP常见面试题(全面)


文章目录

      • 1. 简述TCP的三次握手过程
      • 2. 简述TCP的四次挥手过程
      • 3. 为什么连接的时候是三次握手,关闭连接的时候是四次挥手?
      • 4. 为什么连接的时候不能两次握手,需要三次呢?
      • 5. 为什么客户端最后还要等待2MSL才能关闭连接?
      • 6. 如果已经建立了连接,但是客户端突然出现了故障怎么办?
      • 7. TCP和UDP的区别
      • 8. TCP为什么是可靠连接
      • 9. TCP,UDP的应用场景
      • 10.什么是半连接队列
      • 11. SYN攻击是什么?
      • 12. 三次握手过程中可以携带数据吗
      • 13. ISN是固定的吗

1. 简述TCP的三次握手过程
TCP和UDP常见面试题(全面)
文章图片

  1. 第一次握手(C:我想和你连接):C将数据包的标志位SYN设置为1,并随机产生一个值seq=J,并把该数据包发送给S,这时C进入了SYN_SENT状态,等待S的确认
  2. 第二次握手(S:好的我同意):S收到数据包后由SYN=1直到C在请求连接,S将数据包的标志位SYN和ACK都设置为1,ack=J+1,再随机产生一个值seq=K,发送该数据包给C,这时S进入SYN_RCVD状态
  3. 第三次握手(C:好的我知道你同意了):C收到S的确认之后,检查ack是否为J+1,ACK是否为1。如果是就再发送数据包给S,把数据包中的ack=K+1,ACK置为1。S收到后检查ack是否为K+1,ACK是否为1,如果是则连接建立成功,完成三次握手,可以传输数据了。
TCP和UDP常见面试题(全面)
文章图片

2. 简述TCP的四次挥手过程
TCP和UDP常见面试题(全面)
文章图片

由于TCP连接是全双工的,所以每个方向都要单独关闭不能只关闭一个方向。当两个方向都分别发送并接收到了FIN之后,这才是关闭连接了。
  1. 第一次挥手:C发送一个FIN,来关闭C到S的数据传递
  2. 第二次挥手:S收到FIN后,发一个ACK给C,确认序号为收到序号+1
  3. 第三次挥手:S发送一个FIN,来关闭S到C的数据传递
  4. 第四次挥手:C收到FIN后,发一个ACK给S,确认序号为收到序号+1
3. 为什么连接的时候是三次握手,关闭连接的时候是四次挥手?
建立连接的时候,服务器在收到连接请求的SYN报文后,把ACK和SYN放在一个报文中发送给客户端,其中ACK报文是用来应答的,SYN报文是用来同步的。但是一般关闭连接时服务器的ACK和FIN是分开发的。故需要四步握手。服务器收到关闭连接的FIN报文时,自己未必把全部数据都发送给对方了,所以服务器只能先回复一个ACK表示你发的FIN我收到了,在发送完所有数据给客户端后,才能发送FIN报文给客户端,客户端收到FIN之后再发送ACK确认给服务器,之后客户端就进入了TIME_WAIT状态。注意这时连接并没有释放了,必须经过2MSL(最长报文段寿命)的时间后,客户端撤销相应的TCB后,客户端才进入CLOSED状态。服务器端只要收到了客户端的确认,就进入了CLOSED状态。所以服务器结束TCP连接的时间比客户端早一些
4. 为什么连接的时候不能两次握手,需要三次呢?
三次握手完成的功能:确认双方的接收能力和发送能力是否正常;连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号,交换TCP窗口大小信息
  • 防止已经失效的连接请求报文突然传送到服务器,从而产生错误。(场景:客户端之前发送了一个连接请求并且没有丢失,只是在网络结点中滞留的时间太长了,之后网络通畅又到达了服务器,那两次握手成功了就建立连接的话会导致不必要的错误和资源的浪费)
  • 两次握手可能产生死锁:比如在两次握手的机制下,C给S发送了连接请求,S收到后发送了确认应答分组,那么S认为连接已经成功建立了。但是如果S给C的应答分组丢失了,那么C认为连接未建立成功,就会一直等待确认应答分组。
5. 为什么客户端最后还要等待2MSL才能关闭连接?
  • 为了确保客户端发送的最后一个ACK报文可以到达服务器,就算ACK丢失了,服务器收不到,会以为发送的FIN客户端没有收到,会再发一次。而客户端可以再2MSL这个时间内收到这个重传的报文,再次给出回应报文
  • 为了防止之前已经失效的连接请求报文出现在本连接中,在客户端发送完最后一个ACK后,在2MSL的时间内,本连接时间内产生的所有报文段都会从网络中消失,这样新的连接就不会出现旧连接的请求报文
6. 如果已经建立了连接,但是客户端突然出现了故障怎么办?
TCP设有一个保活计时器,服务器每收到一次客户端的请求后都会重新复位这个计时器,时间设置通常为2小时,如果两小时还没有收到客户端的任何数据,那么服务器会发送一个探测报文段,每隔75s发送一次,如果发送10个探测报文都没有反应,服务器就认为客户端出现故障,接着关闭连接
7. TCP和UDP的区别
  • TCP是面向连接的,UDP是面向无连接的(面向连接即在互通前会先建立连接,如TCP的三次握手)
  • UDP的程序结构较简单
  • TCP是面向字节流的,UDP是面向报文的
  • TCP保证数据正确性,UDP不保证正确性
  • TCP保证数据顺序,UDP不保证
8. TCP为什么是可靠连接
  • 通过TCP连接传输的数据无差错,不丢失,不重复,并且按顺序到达
  • TCP报文里的序号可以使TCP的数据按顺序到达
  • 报文头里面的确认序号可以保证不丢包,有累计确认以及超时重传机制
  • TCP拥有流量控制及拥塞控制的机制
9. TCP,UDP的应用场景
**TCP:**应用于对效率要求较低,但是对准确性要求较高的场景(由于需要对数据确认,重发,排序所以效率低)例子:文件传输,电子邮件,远程登录
**UDP:**应用于对效率要求较高,实时性要求高,但是对准确性要求较低的场景。例子:QQ聊天,在线视频,语音电话,广播通信(广播多播)
10.什么是半连接队列
在服务器第一次接收客户端的SYN后,会处于SYN_RCVD 状态,此时双方还没有完全建立其连接,服务器会把此种状态下请求连接放在一个队列里,我们把这种队列称之为半连接队列。还有一个全连接队列,就是已经完成三次握手,建立起连接的就会放在全连接队列中。如果队列满了就有可能会出现丢包现象。
【TCP和UDP常见面试题(全面)】关于SYN-ACK 重传次数的问题:服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传。如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。
注意,每次重传等待的时间不一定相同,一般会是指数增长,例如间隔时间为 1 s,2 s,4 s,8 s…
11. SYN攻击是什么?
服务器端的资源分配是在二次握手时分配的,而客户端的资源是在完成三次握手时分配的,所以服务器容易受到SYN洪泛攻击。
SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server则回复确认包,并等待Client确认,由于源地址不存在,因此Server需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络拥塞甚至系统瘫痪。
netstat -n -p TCP | grep SYN_RECV//可以用于检测SYN攻击

常见的防御 SYN 攻击的方法有如下几种:
  • 缩短超时(SYN Timeout)时间
  • 增加最大半连接数
  • 过滤网关防护
  • SYN cookies技术
12. 三次握手过程中可以携带数据吗
第三次握手可以携带数据,但是第一二次不可以带数据
由于如果第一次握手带数据,会让服务器更容易受到攻击。但是第三次握手时,对客户端来说已经建立连接了,而且知道服务器的接收发送能力是正常的,所以可以带数据。
13. ISN是固定的吗
是动态生成的,三次握手的其中一个重要功能是客户端和服务端交换 ISN,以便让对方知道接下来接收数据的时候如何按序列号组装数据。如果 ISN 是固定的,攻击者很容易猜出后续的确认号

    推荐阅读