首页 > 其他分享 >常见面试题-TCP三次握手四次挥手

常见面试题-TCP三次握手四次挥手

时间:2023-11-07 20:02:14浏览次数:30  
标签:面试题 ACK 报文 SYN TCP 四次 FIN 服务端 客户端

TCP 三次握手/四次挥手

参数

用途

SYN

用于启动和建立连接时,同步设备之间的序列号。0到2^32 - 1的随机数。

ACK

向另一端确认已经收到 SYN,数值为收到 SYN 增一。

SYN-ACK

确认之前收到了 SYN,数值为自定义值。

FIN

终止连接。

RST

重置连接。

三次握手

常见面试题-TCP三次握手四次挥手_三次握手

三次握手流程为:

  1. 第一次握手:client 请求建立连接,发送 SYN 包到主机 B,并进入 SYN_SEND 状态,等待 server 回应
  2. 第二次握手:server 向 client 发送 SYN+ACK 包,表示也想和 client 建立连接并确认 client 的报文,并进入 SYN_RECV 状态
  3. 第三次握手:client 收到 server 发送的 SYN+ACK 包,向 server 发送 ACK 包

为什么需要三次握手?

有很多种说法,这里列出以下两种说法(自我感觉第一种说法比较浅显易懂):

  • 因为经过了三次握手,主机 A 和主机 B 才可以保证自己的发送能力和接收能力都是正常的,那么理论上双方收发能力正常,证明网络可靠,可以进行通信。
  • 在谢希仁版《计算机网络》中是这样说的,如果 client 发送的第一个 SYN 包并没有丢失,只是在网络中滞留,以致于延误到连接释放以后的某个时间才到达 server。本来这是一个早已失效的报文,但 server 收到此失效报文后,就误认为是 client 再次发出的一个新的连接,于是向 client 发出 SYN+ACK 包,如果不采用三次握手,只要 server 发出 SYN+ACK 包,就建立连接,会导致 client 没有发出建立连接的请求,因此不会理会 server 的 SYN+ACK 包,但是 server 却以为新的连接建立好了,并一直等待 client 发送数据,导致资源被浪费

四次挥手

常见面试题-TCP三次握手四次挥手_客户端_02

四次挥手流程为:

  1. 第一次挥手:客户端想要终止连接时,向服务端发送 FIN,客户端进入 FIN_WAIT_1 状态,表示客户端没有数据要发送给服务端了,但是如果服务端还有数据没有发送完,服务端可以继续发送数据
  2. 第二次挥手:服务端收到客户端终止请求后,回复 ACK 确认 FIN,表示已经收到客户端的中断请求,但是服务端还有数据需要发,此时客户端进入 FIN_WAIT_2 状态,继续等待服务端的 FIN(中断连接) 报文
  3. 第三次挥手:TCP 的连接是相互独立的,当服务端已经发送完数据了,向客户端发送 FIN=1 报文,告诉客户端数据已经发送完毕,准备好关闭连接了,服务端此时进入 LAST_ACK 状态
  • 如果服务端一直没有收到客户端返回的 ACK 报文,那么就会触发超时重传,服务端会重传 FIN 报文
  1. 第四次挥手:客户端收到服务端的 FIN 后,知道可以关闭连接了,因此向服务端发送 ACK 报文,并进入 TIME_WAIT 状态(如果客户端不向服务端发送 ACK ,那么服务端并不请求客户端是否收到了服务端关闭连接的请求,假如服务端发送给客户端的 FIN 报文丢失,那么客户端就一直以为服务端没有请求关闭连接,导致连接无法关闭)
  • 如果客户端在 2msl 内,再次收到了来自服务端的 FIN 报文,说明服务器端没有收到客户端的 ACK 报文,客户端重新向服务端发送 ACK 报文,计时器重置
  • 如果客户端再 2msl 内没有收到服务端的 FIN 报文,说明服务端正常接收了 ACK 确认报文,客户端可以进入 CLOSED 状态

为什么客户端的 TIME_WAIT 时间是 2msl 呢?

首先 msl 是报文的最大生存时间,如果超过 msl,那么报文就会被丢弃

那么客户端等待 2msl 是因为,客户端的 ACK 到达服务端最多花费 1msl,而服务端重发 FIN 报文也最多花费 1msl,因此如果客户端的 ACK 报文丢失,最多 2msl 的时间就可以收到服务端重发的 FIN 报文

为什么要第四次挥手呢? 其实很容易,我们想一下如果没有通过第四次挥手对 server 发给 client 的 FIN 报文进行确认,如果这个报文丢失的话,客户端就不知道需要关闭连接了,服务端也不知道报文丢失,也不重发,导致客户端一直认为连接处于打开状态

标签:面试题,ACK,报文,SYN,TCP,四次,FIN,服务端,客户端
From: https://blog.51cto.com/u_16186397/8238987

相关文章

  • 聊一聊 tcp/ip 在.NET故障分析的重要性
    一:背景1.讲故事这段时间分析了几个和网络故障有关的.NET程序之后,真的越来越体会到计算机基础课的重要,比如计算机网络课,如果没有对tcpip协议的深刻理解,解决这些问题真的很难,因为你只能在高层做黑盒测试,你无法看到tcp层面的握手和psh通讯。这篇我们通过两个小例子来理解一......
  • 史上最全的Android面试题集锦
    前言由于之前从上海离职,来到深圳找工作。然后准备面试的时候,发现网上很多Android面试题及答案整理都没有答案,在成功的拿到几家公司的offer后(虽然不是阿里、网易这种级别的公司,但对我一个毕业三年的Android开发来说,算是成功的从小公司跳到大公司)自己总结了一些最近面试过的Androi......
  • Java 并发多线程面试题及答案
    1、并发编程三要素?(1)原子性原子性指的是一个或者多个操作,要么全部执行并且在执行的过程中不被其他操作打断,要么就全部都不执行。(2)可见性可见性指多个线程操作一个共享变量时,其中一个线程对变量进行修改后,其他线程可以立即看到修改的结果。(3)有序性有序性,即程序的执行顺序......
  • 你真的知道TCP协议中的序列号确认、上层协议及记录标识问题吗?
    引言在前面的内容中,我们已经详细讲解了一系列与TCP相关的面试问题。然而,这些问题都是基于个别知识点进行扩展的。今天,我们将重点讨论一些场景问题,并探讨如何解决这些问题。序列号确认问题当A主机与B主机建立了TCP连接后,A主机发送了两个TCP报文,分别大小为500和300字节。第一个报......
  • 每天5道Java面试题(第四天)
    1. Integer和int的区别?1、Integer是int的包装类,int则是java的一种基本数据类型 2、Integer变量必须实例化后才能使用,而int变量不需要 3、Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值。4、Integer的默认值是null,int的默认......
  • 面试题-高可用高并发问题
    原因:最近面试被问到高并发和高可用的问题,总是不知道怎么回答,于是做了这张图说明:从一条请求的发送这条思路走,就比较容易的回答出来了......
  • 08. 并发TCP服务器
    一、并发TCP服务器  我们使用线程的方式实现并发TCP服务器。fromsocketimportsocketfromsocketimportAF_INET,SOCK_STREAM,SOL_SOCKET,SO_REUSEADDRfromtimeimportctimefromthreadingimportThreadHOST="127.0.0.1"PORT=8080ADDRESS=(HOST,PORT......
  • Golang面试题从浅入深高频必刷「2023版」
    大家好,我是阳哥。专注Go语言的学习经验分享和就业辅导。Go语言特点Go语言相比C++/Java等语言是优雅且简洁的,是我最喜爱的编程语言之一,它既保留了C++的高性能,又可以像Java,Python优雅的调用三方库和管理项目,同时还有接口,自动垃圾回收和goroutine等让人拍案叫绝的设计。有许多基于......
  • TCP协议:超时重传、流量控制、keep-alive和端口号,你真的了解吗?
    引言在之前的讲解中,我们已经介绍了TCP协议的一些面试内容,相信大家对于TCP也有了一些新的了解。今天,我们将继续深入探讨TCP的超时重传、流量控制、TCP的keepalive机制以及端口号等相关信息。这些内容对于理解TCP协议的工作原理和实际应用非常重要,希望可以加深大家对TCP协议的理解......
  • TCP三次握手的机制
    工作原理描述1)客户端主动向服务器端发送请求SYN(SynchronizeSequenceNumbers),发送SYN=1,seq=n(随机序号)2)服务器端接收到请求后,进行确认,回复SYN=1,ACK=n+1(确认),seq=k(随机序号)3)客户端进行确认,回复SYN=1,ACK=k+1(确认),seq=n+1为什么需要三次握手TCP(transmissioncontrolprotocol)是可靠......