志在指尖
用双手敲打未来

tcp三次握手(tcp三次握手和四次挥手的全过程)

tcp三次握手

TCP三向握手是浏览器与服务器建立连接的一种方式。目的是让两者建立连接,方便后续的数据交换和传输。
第一次握手:浏览器向服务器发起请求建立连接
第二次握手:服务器告诉浏览器我同意你的连接请求,我也向你发起连接建立请求
第三次握手:浏览器也告诉服务器我同意建立连接。
此时,双方都知道对方已经同意建立连接并准备好进行数据传输,并且对方也知道自己的情况。然后可以传输数据
简单示意图
一次性握手:客户端向服务器发送一个带有SYN标志的连接请求包
第二次握手:服务器向客户端发送带有SYN+ACK标志的连接请求和响应包
三路握手:客户端向服务端发送带有ACK标志的响应包(可以携带数据)tcp

tcp三次握手和四次挥手的全过程

开始两端的TCP进程都处于CLOSED关闭情况,A自动翻开联接,而B被迫翻开联接。
(A、B关闭情况CLOSED——B收听情况LISTEN——A同步已发送情况SYN-SENT——B同步收到情况SYN-RCVD——A、B联接已建立情况ESTABLISHED)
B的TCP服务器进程先创建传输操控块TCB,准备承受客户进程的联接央求。然后服务器进程就处于LISTEN(收听)情况,等候客户的联接央求。若有,则作出呼应。
1)第一次握手:A的TCP客户进程也是首要创建传输操控块TCB,然后向B宣告联接央求报文段,(首部的同步位SYN=1,初始序号seq=x),(SYN=1的报文段不能带着数据)但要耗费掉一个序号,此时TCP客户进程进入SYN-SENT(同步已发送)情况。
2)第2次握手:B收到联接央求报文段后,如赞同建立联接,则向A发送供认,在供认报文段中(SYN=1,ACK=1,供认号ack=x+1,初始序号seq=y),检验TCP服务器进程进入SYN-RCVD(同步收到)情况;
3)第三次握手:TCP客户进程收到B的供认后,要向B给出供认报文段(ACK=1,供认号ack=y+1,序号seq=x+1)(初始为seq=x,第二个报文段所以要+1),ACK报文段可以带着数据,不带着数据则不耗费序号。TCP联接现已建立,A进入ESTABLISHED(已建立联接)。
当B收到A的供认后,也进入ESTABLISHED情况。
(2)总结三次握手进程:
第一次握手:起先两端都处于CLOSED关闭情况,Client将标志位SYN置为1,随机发生一个值seq=x,并将该数据包发送给Server,Client进入SYN-SENT情况,等候Server供认;
第2次握手:Server收到数据包后由标志位SYN=1得知Client央求建立联接,Server将标志位SYN和ACK都置为1,ack=x+1,随机发生一个值seq=y,并将该数据包发送给Client以供认联接央求,Server进入SYN-RCVD情况,此时操作系统为该TCP联接分配TCP缓存和变量;
第三次握手:Client收到供认后,查看ack是否为x+1,ACK是否为1,假设正确则将标志位ACK置为1,ack=y+1,而且此时操作系统为该TCP联接分配TCP缓存和变量,并将该数据包发送给Server,Server查看ack是否为y+1,ACK是否为1,假设正确则联接建立成功,Client和Server进入ESTABLISHED情况,完毕三次握手,随后Client和Server就可以开始传输数据。
起先A和B都处于CLOSED情况——B创建TCB,处于LISTEN情况,等候A央求——A创建TCB,发送联接央求(SYN=1,seq=x),进入SYN-SENT情况——B收到联接央求,向A发送供认(SYN=ACK=1,供认号ack=x+1,初始序号seq=y),进入SYN-RCVD情况——A收到B的供认后,给B宣告供认(ACK=1,ack=y+1,seq=x+1),A进入ESTABLISHED情况——B收到A的供认后,进入ESTABLISHED情况。
TCB传输操控块TransmissionControlBlock,存储每一个联接中的重要信息,如TCP联接表,到发送和接纳缓存的指针,到重传队伍的指针,当时的发送和接纳序号。
(3)为什么A还要发送一次供认呢?可以二次握手吗?
答:首要为了防止已失效的联接央求报文段忽然又传送到了B,因此发生过错。如A宣告联接央求,但因联接央求报文丢掉而未收到供认,所以A再重传一次联接央求。后来收到了供认,建立了联接。数据传输完毕后,就开释了联接,A工宣告了两个联接央求报文段,其间第一个丢掉,第二个抵达了B,但是第一个丢掉的报文段只是在某些网络结点长时间滞留了,延误到联接开释今后的某个时间才抵达B,此时B误认为A又宣告一次新的联接央求,所以就向A宣告供认报文段,赞同建立联接,不选用三次握手,只需B宣告供认,就建立新的联接了,此时A不答理B的供认且不发送数据,则B共同等候A发送数据,浪费资源。
(4)Server端易遭到SYN侵犯?
服务器端的资源分配是在二次握手时分配的,而客户端的资源是在完毕三次握手时分配的,所以服务器简略遭到SYN洪泛侵犯,SYN侵犯就是Client在短时间内假造大量不存在的IP地址,并向Server不断地发送SYN包,Server则回复供认包,并等候Client供认,由于源地址不存在,因此Server需求不断重发直至超时,这些假造的SYN包将长时间占用未联接队伍,导致正常的SYN央求由于队伍满而被丢掉,然后引起网络拥塞乃至系统瘫痪。
防范SYN侵犯方法:下降主机的等候时间使主机尽快的开释半联接的占用,短时间遭到某IP的重复SYN则丢掉后续央求。
TCP报文剖析–三次握手四次挥手
application/msword4星超越75%的资源626KB
下载
2、四次挥手
(1)四次挥手的详述
在这里刺进图片描绘
假定Client端建议间断联接央求,也就是发送FIN报文。Server端接到FIN报文后,意思是说”我Client端没有数据要发给你了”,但是假设你还有数据没有发送完毕,则不用急着关闭Socket,可以继续发送数据。所以你先发送ACK,“奉告Client端,你的央求我收到了,但是我还没准备好,请继续你等我的音讯”。这个时分Client端就进入FIN_WAIT情况,继续等候Server端的FIN报文。当Server端供认数据已发送完毕,则向Client端发送FIN报文,“奉告Client端,好了,我这边数据发完了,准备好关闭联接了”。Client端收到FIN报文后,”就知道可以关闭联接了,但是他仍是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT情况,假设Server端没有收到ACK则可以重传。“,Server端收到ACK后,“就知道可以断开联接了”。Client端等候了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭联接了。Ok,TCP联接就这样关闭了!
数据传输完毕后,通讯的两头都可开释联接,A和B都处于ESTABLISHED情况。
(A、B联接建立情况ESTABLISHED——A间断等候1情况FIN-WAIT-1——B关闭等候情况CLOSE-WAIT——A间断等候2情况FIN-WAIT-2——B终究供认情况LAST-ACK——A时间等候情况TIME-WAIT——B、A关闭情况CLOSED)
1)A的运用进程先向其TCP宣告联接开释报文段(FIN=1,序号seq=u),并间断再发送数据,自动关闭TCP联接,进入FIN-WAIT-1(间断等候1)情况,等候B的供认。
2)B收到联接开释报文段后即宣告供认报文段,(ACK=1,供认号ack=u+1,序号seq=v),B进入CLOSE-WAIT(关闭等候)情况,此时的TCP处于半关闭情况,A到B的联接开释。
3)A收到B的供认后,进入FIN-WAIT-2(间断等候2)情况,等候B宣告的联接开释报文段。
4)B没有要向A宣告的数据,B宣告联接开释报文段(FIN=1,ACK=1,序号seq=w,供认号ack=u+1),B进入LAST-ACK(终究供认)情况,等候A的供认。
5)A收到B的联接开释报文段后,对此宣告供认报文段(ACK=1,seq=u+1,ack=w+1),A进入TIME-WAIT(时间等候)情况。此时TCP未开释掉,需求通过时间等候计时器设置的时间2MSL后,A才进入CLOSED情况。
(2)总结四次挥手进程:
起先A和B处于ESTABLISHED情况——A宣告联接开释报文段并处于FIN-WAIT-1情况——B宣告供认报文段且进入CLOSE-WAIT情况——A收到供认后,进入FIN-WAIT-2情况,等候B的联接开释报文段——B没有要向A宣告的数据,B宣告联接开释报文段且进入LAST-ACK情况——A宣告供认报文段且进入TIME-WAIT情况——B收到供认报文段后进入CLOSED情况——A通过等候计时器时间2MSL后,进入CLOSED情况。
(3)为什么A在TIME-WAIT情况有必要等候2MSL的时间?
MSL最长报文段寿数MaximumSegmentLifetime,MSL=2
答:两个理由:
1)保证A发送的终究一个ACK报文段可以抵达B。
2)防止“已失效的联接央求报文段”出现在本联接中。
1)这个ACK报文段有或许丢掉,使得处于LAST-ACK情况的B收不到对已发送的FIN+ACK报文段的供认,B超时重传FIN+ACK报文段,而A能在2MSL时间内收到这个重传的FIN+ACK报文段,接着A重传一次供认,重新启动2MSL计时器,终究A和B都进入到CLOSED情况,若A在TIME-WAIT情况不等候一段时间,而是发送完ACK报文段后当即开释联接,则无法收到B重传的FIN+ACK报文段,所以不会再发送一次供认报文段,则B无法正常进入到CLOSED情况。
2)A在发送完终究一个ACK报文段后,再通过2MSL,就可以使本联接继续的时间内所发生的一切报文段都从网络中消失,使下一个新的联接中不会出现这种旧的联接央求报文段。
(4)为什么联接的时分是三次握手,关闭的时分却是四次握手?
答:由于当Server端收到Client端的SYN联接央求报文后,可以直接发送SYN+ACK报文。其间ACK报文是用来应答的,SYN报文是用来同步的。但是关闭联接时,当Server端收到FIN报文时,很或许并不会当即关闭SOCKET,所以只能先回复一个ACK报文,奉告Client端,“你发的FIN报文我收到了”。只需等到我Server端一切的报文都发送完了,我才华发送FIN报文,因此不能一同发送。故需求四步握手。
(5)为什么TIME_WAIT情况需求通过2MSL(最大报文段生计时间)才华返回到CLOSE情况?
答:尽管按道理,四个报文都发送完毕,我们可以直接进入CLOSE情况了,但是我们有必要假象网络是不可靠的,有可以终究一个ACK丢掉。所以TIME_WAIT情况就是用来重发或许丢掉的ACK报文。

未经允许不得转载:IT技术网站 » tcp三次握手(tcp三次握手和四次挥手的全过程)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载