- 视频教程: 一条视频讲清楚TCP协定与UDP协定-什么是三次握手与四次挥手_哔哩哔哩_bilibili
- 视频教程: TCP三次握手和四次挥手_哔哩哔哩_bilibili
1、TCP协定和UDP协定
- TCP协定和UDP协定都工作在传输层。
1)TCP协定
- TCP协定是基于连贯的,相当于打电话,只有对方接起来电话,通话才会开始。
- TCP协定的长处是稳固牢靠,实用于对网络通信品质较高的场景,比方传输文件,发送邮件,浏览网页等。
2)UDP协定
- UDP协定是基于非连贯的,相当于寄一封信,信寄出去后,不论对方是否收到信(是否丢包),也不论多封函件是否按程序达到(数据包乱序)。
- UDP协定的长处是速度快,然而可能产生丢包,实用于对实时性要求较高然而对大量丢包没有要求的场景,比方语音通话,视频直播。
2、TCP协定的连贯
- SYN包,指 synchronization,意为同步。
- ACK包,指 acknowledgment,意为确认。
- FIN包,指 finish,意为终止。
1)三次握手
- 三次握手是建设连贯的过程。三次握手的实质是为了解决网络信道不牢靠的问题,为了在不牢靠的信道上建设牢靠的连贯。
(1)第一次握手
- 客户端会随机初始化序号,将该序号搁置在TCP首部的【序号】字段中,同时把SYN标记地位1,示意SYN报文。
- 接着把第一个SYN报文发送给服务端,示意向服务端发动连贯,该报文不蕴含应用层数据,之后客户端处于SYN-SENT状态。
(2)第二次握手
- 服务端收到客户端的SYN报文后,首先服务端也随机初始化本人的序号,将此序号搁置在TCP首部的【序号】字段,其次把客户端的序号+1并搁置在TCP首部的【确认号】,而后把SYN标记位和ACK标记位都置1。
- 接着把该报文发送给客户端,该报文也不蕴含应用层数据,之后服务端处于SYN-RCVD状态。
(3)第三次握手
- 客户端收到服务器报文后,还须要向服务器发送一个应答报文。首先该应答报文的TCP首部ACK标记位为1,其次把服务端的序号+1并搁置在TCP首部的【确认号】。
最初把应答报文发送给服务端,==这次报文能够携带服务端的数据,==服务端收到应答报文后,连贯建设。
(4)DDOS 攻打
- 实际上,如果黑客一直向服务端发送SYN包又不进行下一步,服务器须要一直记住对方的序号和本人新生成的序号,最终导致服务器奔溃,这就是典型的DDOS攻打。因而,服务器罗唆不保留本人的序号,通过服务器的IP地址和端口等公有信息进行算法运算失去序号。
2)四次挥手
- 处于连贯状态的客户端和服务端都能够被动发动敞开连贯申请。
(1)第一次挥手
- 假如客户端被动发动敞开连贯申请,此时客户端向服务端发送一个TCP首部的Fin标记位被置1的报文,即FIN报文,之后客户端本人进入终止期待1状态。
客户端向服务端发送
FIN
时,仅仅示意客户端不再发送数据了然而还能接收数据。
(2)第二次挥手
服务端收到Fin包后,向客户端发送一个ACK包,服务端进入了敞开期待状态。
(3)第三次挥手
- 客户端收到服务端的ACK报文后,进入终止期待2状态。
- 服务端此时还能够发送未发送的数据,而客户端还能够接收数据。
服务端不再发送数据时,向客户端发送一个Fin包,并进入最初确认状态。
(3)第四次挥手
- 客户端收到服务端的Fin包后,向服务端发送ACK包,并进入超时期待状态。
- 服务端收到ACK包后,进入 closed 状态,至此服务端实现连贯的敞开。
客户端期待 2MSL 一段时间后,主动进入 closed 状态,至此客户端实现连贯的敞开。
- MSL 指的是 Maximum Segment Lifetime:一段 TCP 报文在传输过程中的最大生命周期。
- 2MSL 即是服务器端收回为 FIN 报文和客户端收回的 ACK 确认报文所能放弃无效的最大时长。
3、为什么不是两次握手?
- 为了避免曾经生效的申请报文,忽然又传到服务器引起谬误。
- 假如是两次握手,客户端向服务器发送SYN包(A),因为某些起因,导致SYN在网络中滞留。
- 客户端在期待了一段时间后,发现没有收到服务端的确认报文,会从新发送SYN包(B),B包胜利达到了服务端,服务端发送确认报文给客户端,连贯建设。
- 一段时间后,服务器收到了A包,服务器发送确认报文给客户端,连贯建设。
- 此时呈现了问题,客户端认为只建设了一个连贯,而服务端认为建设了两个连贯,造成了状态不统一。
- 在三次握手的状况下,服务端没有收到客户端第三次握手的ACK包,就不会认为连贯建设胜利。
4、为什么不是四次握手?
- 因为通信不可能100%牢靠,而下面的三次握手曾经做好了通信的筹备工作,再减少握手,并不能显著进步可靠性,而且也没有必要。