本文转载自微信公众号「Java极客技术」,作者鸭血粉丝。转载本文请联系Java极客技术公众号。
之前总有是有面试官喜欢问,你知道什么是三次握手么?什么是四次挥手么?为什么握手需要三次,挥手需要四次呢?今天我们就来详细的聊一下这个。
1.什么是TCP
TCP协议,简单称呼一下的话,那就是传输控制协议,为什么这么称呼它呢,因为这个协议就是用来对数据的传输进行控制的一个协议,这个大家肯定也都是没有异议的。
TCP有时候你会在很多书中看它们称之为“套接字”,其实这就是翻译,在原著中的意思可能就是 a place on a surface or machine with holes for connecting a piece of electrical equipment.,然后经过翻译的手,翻译过来就是套接字的意思,其实大家心里清楚就行,问这个的几乎不怎么存在。所以大家就是知道就可以了。
我们也都知道网络协议是分层的,7层(5层),可以分为不标准的7层,也可以分为标准的五层(也有人说是4层,区别不大,就少了一个物理层面),实际上这个标准阿粉个人感觉还是笼统的和细微的差别就像这个图。
而这个分层的概念则是不同的,如果说你是按照OSI七层模型结构体来分,那就是7层,如果是按照TCP/IP,那么就是4层。在这里的TCP,就是在我们的数据传输层里面,因为毕竟阿粉之前就说了,传输控制协议嘛。
2.TCP协议的报文
而在TCP/IP的分层中,就算是数据传输层,那也是有着不是TCP协议的存在的,比如说还有UDP,就像下图。
TCP和UDP是两种最为著名的运输层协议,二者都使用IP作为网络层协议。
尽管TCP使用的是不可靠的IP服务,但是它提供的传输层服务,却是更加可靠的。
那么我们就先来看看这个TCP协议的报头是什么样子的,把抽象的东西具体化一点,才能更加的加深理解。
TCP数据被封装在一个IP数据报中,就像上图所示,而我们需要分析的,就是其中的TCP数据报中。
每个TCP段都包含源端和目的端的端口号,用于寻找发端和收端应用进程。这两个值加上IP首部中的源端IP地址和目的端IP地址唯一确定一个TCP连接。
这个时候我们就得来看看里面都有些什么东西了,
U R G 紧急指针有效
A C K 确认序号有效
P S H 接收方应该尽快将这个报文段交给应用层
R S T 重建连接
S Y N 同步序号用来发起一个连接。这个标志和下一个标志将在第 1 8章介绍
F I N 发端完成发送任务
3.TCP的三次握手连接是什么样子的
既然我们文章要说的是TCP的三次握手,和四次挥手,那么肯定是说的连接,也不是说的其他的。那么它这个连接的过程说的是什么呢?
我们还是从图中理解,这样比较好理解,
简单的来说SYN—SENT状态,同步已发送状态,这是第一次握手的时候的状态。
这个第二次握手就会进入到同步收到状态。
而当第三次握手连接完成的时候,已经标志了现在是已经完全的建立了连接,而这个时候就可以进行数据传递了。
有时候就有人会问了,为什么是三次握手而不是两次,也不是四五次呢?一般情况下问这种问题的都会是面试官,如果你在面试过程中已经把这个三次握手说完了之后,他有时候就会问这种问题,让你谈谈你自己的理解,那么为什么呢?
在RFC 793 指出的 TCP 连接使用三次握手的首要原因:he principle reason for the three-way handshake is to prevent old duplicate connection initiations from causing confusion.
翻译过来就是三次握手的主要原因是防止旧的重复连接启动引起混淆。
也就是说,如果客户端连续发出多个SYN建立连接的报文的话,在网络拥堵的情况就会出现,一个「旧 SYN 报文」比「最新的 SYN 」 报文早到达了服务端,那么此时服务端就会回一个 SYN + ACK 报文给客户端,客户端收到后可以根据自身的上下文,判断这是一个历史连接(序列号过期或超时),那么客户端就会发送 RST 报文给服务端,表示中止这一次连接。
而如果是两次握手,那么完蛋了,这时候判断不出这个连接是不是历史连接,中断还是不中断,这就没办法处理了,而三次握手就可以在客户端进行第三次发送报文的时候,有足够的上下文来判断这个连接到底是否属于历史连接。
那么为什么不是四次连接呢?大家可以继续翻到上面的图,如果是四次连接,那么也就是说,把ACK和SYN进行了分开,seq=y和ack=x+1这两步进行了分开,虽然四次握手也能够完成这一步,但是为了省事,人家还是三部就做完了,这样一来,也能确保双方的初始序列号能被可靠的同步,何必在多费一步操作呢?
4.TCP连接的四次挥手
既然我们TCP连接的时候进行了三次握手,为什么要中断的时候,我们要进行四次挥手呢?这还是得从图中来理解这个事情。
那么为什么是四次呢?之前阿粉面试别人的时候,有个哥们给我了一句话,由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这话比较笼统,但是没解释清楚为啥要做四次挥手,这是最尴尬的,然后问详细的样子是什么样的,他也解答的不错。
那么为什么呢?
这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。
也就是说,在关闭的时候,为了确认是否关闭连接,ACK的报文和FIN的报文是进行分开发送,而这时候,挥手的次数也就从三次变成了4次,这样是不是就好理解一点了。
5. 文章参考
近年来,在机器人产业发展如火如荼的情况下,餐饮传统行业逐渐焕发第二春。机器...
今天突然看到一个砌墙机器人的简讯,一小时可以砌200块砖,又不需要吃饭喝水休息...
1.你永远都不会知道,为你胡思乱想的人有多么爱你。 2.因为我有一个很爱我的他...
上一篇文章我们了解了Unix标准的5种网络I/O模型,知道了它们的核心区别与各自的...
三大运营商的社交梦想仍未熄灭,趁着5G商用的东风,5G消息已经在为最后商用做准...
近日,微信迎来了8.0版本的更新。在此次更新中,最让人津津乐道的便是聊天框自带...
昨天微信出现了bug, 很多人无法接收到信息 ,微信刚道完歉,今天企业微信也崩溃...
上世纪,一位名叫尼古拉特斯拉的科学家,预言了100年后的今天,每个人手中都将有...
根据澎湃新闻报道,世界经济论坛公开了一份关于机器人革命的报告,引起了全球范...
据外媒报道,俄罗斯电信运营商MTS日前宣布,其部分客户将能够在俄罗斯首都周边十...