大神告诉你TCP建立连接为什么是三次握手

方案
tcp建立连接为什么是三次握手,而不是两次或四次?
tcp,名为传输控制协议,是一种可靠的传输层协议,ip协议号为6。
顺便说一句,原则上任何数据传输都无法确保绝对可靠,三次握手只是确保可靠的基本需要。
举个日常例子,打电话时我们对话如下:
对应为客户端与服务器之间的通信:
于是有了如下对话:
我:1+1等于几?
她:2,2+2等于几?
我:4
首先两个人约定协议
1.感觉网络情况不对的时候,任何一方都可以发起询问
2.任何情况下,若发起询问后5秒还没收到回复,则认为网络不通
3.网络不通的情况下等1min路由器之后再发起询问
对于我而言,发起 “1+1等于几”的询问后
1. 若5s内没有收到回复,则认为网络不通
2. 若收到回复,则我确认①我能听到她的消息 ②她能听到我的消息,然后回复她的问题的答案
对于她而言,当感觉网络情况不对的时候
1. 若没有收到我的询问,则她发起询问
2. 若收到“1+1等于几”,则她确认 ①她可以听到我的消息,然后回复我的问题的答案和她的问题“2,2+2等于几”
3. 若5s内没有收到我的回复“4”,则她确认 ②我听不见她的消息
4. 若5s内收到了我的回复“4”,则她确认 ②我可以听见她的消息
这样,如果上面的对话得以完成,就证明双方都可以确认自己可以听到对方的声音,对方也可以听到自己的声音!
这个故事可以解释tcp为什么要三次握手吗 ... 囧
关于四次挥手
先由客户端向服务器端发送一个fin,请求关闭数据传输。
当服务器接收到客户端的fin时,向客户端发送一个ack,其中ack的值等于fin+seq
然后服务器向客户端发送一个fin,告诉客户端应用程序关闭。
当客户端收到服务器端的fin是,回复一个ack给服务器端。其中ack的值等于fin+seq
为什么要4次挥手?
确保数据能够完整传输。
当被动方收到主动方的fin报文通知时,它仅仅表示主动方没有数据再发送给被动方了。
但未必被动方所有的数据都完整的发送给了主动方,所以被动方不会马上关闭socket,它可能还需要发送一些数据给主动方后,
再发送fin报文给主动方,告诉主动方同意关闭连接,所以这里的ack报文和fin报文多数情况下都是分开发送的。
一、tcp报文格式
tcp报文格式图:
上图中有几个字段需要重点介绍下:
(1)序号:seq序号,占32位,用来标识从tcp源端向目的端发送的字节流,发起方发送数据时对此进行标记。
(2)确认序号:ack序号,占32位,只有ack标志位为1时,确认序号字段才有效,ack=seq+1。
(3)标志位:共6个,即urg、ack、psh、rst、syn、fin等,具体含义如下:
(a)urg:紧急指针(urgent pointer)有效。
(b)ack:确认序号有效。
(c)psh:接收方应该尽快将这个报文交给应用层。
(d)rst:重置连接。
(e)syn:发起一个新连接。
(f)fin:释放一个连接。
需要注意的是:
(a)不要将确认序号ack与标志位中的ack搞混了。
(b)确认方ack=发起方req+1,两端配对。
二、三次握手
tcp(transmission control protocol) 传输控制协议
tcp是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接
位码即tcp标志位,有6种标示:
syn(synchronous建立联机)
ack(acknowledgement确认)
psh(push传送)
fin(finish结束)
rst(reset重置)
urg(urgent紧急)
sequence number(顺序号码)
acknowledge number(确认号码)
establish 建立,创建
所谓三次握手(three-way handshake)即建立tcp连接,是指建立一个tcp连接时,需要客户端和服务端总共发送3个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发,整个流程如下图所示:
(1)第一次握手:client将标志位syn置为1,随机产生一个值seq=j,并将该数据包发送给server,client进入syn_sent状态,等待server确认。
(2)第二次握手:server收到数据包后由标志位syn=1知道client请求建立连接,server将标志位syn和ack都置为1,ack (number )=j+1,随机产生一个值seq=k,并将该数据包发送给client以确认连接请求,server进入syn_rcvd状态。
(3)第三次握手:client收到确认后,检查ack是否为j+1,ack是否为1,如果正确则将标志位ack置为1,ack=k+1,并将该数据包发送给server,server检查ack是否为k+1,ack是否为1,如果正确则连接建立成功,client和server进入established状态,完成三次握手,随后client与server之间可以开始传输数据了。
syn攻击:
在三次握手过程中,server发送syn-ack之后,收到client的ack之前的tcp连接称为半连接(half-open connect),此时server处于syn_rcvd状态,当收到ack后,server转入established状态。syn攻击就是client在短时间内伪造大量不存在的ip地址,并向server不断地发送syn包,server回复确认包,并等待client的确认,由于源地址是不存在的,因此,server需要不断重发直至超时,这些伪造的syn包将长时间占用未连接队列,导致正常的syn请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。syn攻击时一种典型的ddos攻击,检测syn攻击的方式非常简单,即当server上有大量半连接状态且源ip地址是随机的,则可以断定遭到syn攻击了,使用如下命令可以让之现行:
#netstat -nap | grep syn_recv
三、四次挥手
三次握手耳熟能详,四次挥手估计就..所谓四次挥手(four-way wavehand)即终止tcp连接,就是指断开一个tcp连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发,整个流程如下图所示:
由于tcp连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个fin来终止这一方向的连接,收到一个fin只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个tcp连接上仍然能够发送数据,直到这一方向也发送了fin。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。
(1)第一次挥手:client发送一个fin,用来关闭client到server的数据传送,client进入fin_wait_1状态。
(2)第二次挥手:server收到fin后,发送一个ack给client,确认序号为收到序号+1(与syn相同,一个fin占用一个序号),server进入close_wait状态。
(3)第三次挥手:server发送一个fin,用来关闭server到client的数据传送,server进入last_ack状态。
(4)第四次挥手:client收到fin后,client进入time_wait状态,接着发送一个ack给server,确认序号为收到序号+1,server进入closed状态,完成四次挥手。
上面是一方主动关闭,另一方被动关闭的情况,实际中还会出现同时发起主动关闭的情况,具体流程如下图:
流程和状态在上图中已经很明了了,在此不再赘述,可以参考前面的四次挥手解析步骤。
四、附注
关于三次握手与四次挥手通常都会有典型的面试题,在此提出供有需求的同学们参考:
(1)三次握手是什么或者流程?四次握手呢?答案前面分析就是。
(2)为什么建立连接是三次握手,而关闭连接却是四次挥手呢?
这是因为服务端在listen状态下,收到建立连接请求的syn报文后,把ack和syn放在一个报文里发送给客户端。而关闭连接时,当收到对方的fin报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送fin报文给对方来表示同意现在关闭连接,因此,己方ack和fin一般都会分开发送。

AI芯片角逐战再起风浪,三星风投领投,深鉴获4千万美元投资
逆导晶闸管(RCT),逆导晶闸管(RCT)是什么意思
浅析基于DO和DPM的水处理中压紫外反应器的辐射剂量
半导体行业将迎来最新一次的重大并购
怎样获得好的区块链教育
大神告诉你TCP建立连接为什么是三次握手
Atlas Meditech 使用 AI 和数字孪生开创脑外科手术的未来
C语言结构体对齐介绍
企业应该怎样利用云计算,未来可能的市场机会和挑战在哪里
一文详解Unity中渲染顺序问题
2021年有望掀起氮化镓快充热潮
夜景智能照明控制系统特征
高分辨率航空热成像解决方案
电压传感器
数禾科技赋能数字化转型,迎接中国消费升级大潮
华盛锂电2023年度业绩预亏,降幅达108.44%
华为MateX获得全球首个德国TÜV5G手机CE认证
串行系列:预加重与均衡的优缺点总结
iPhone8什么时候上市?iPhone8即将发布最新消息汇总:iPhone8对比iPhone7有何升级?iPhone8逆天功能、价格
工业APP和工业互联网,为制造企业提供转型升级带来四层解决方案