TCP协议“三次握手”与“四次挥手”详解(上)
在使用TCP协议进行数据的传输之前,客户端与服务器端需要建立TCP Connection,即建立连接,之后两端才能进行数据的传输。
下面堆TCP连接“三次握手”的过程进行说明。
1、相关概念
首先,我们需要了解TCP数据报的首部的结构(TCP数据报包括首部以及数据报部分),如下图:
其中需要注意的字段有:
(1)序号(sequence number):seq序号,占32位4个字节。从TCP源端向目的端发送的字节流数据,发起方发送数据报文时对每一个字节进行编号标记,每一个字节都会有一个编号(0 到 232-1)。给报文每个字节编上序号后,需要给报文指派一个序号seq,报文数据段的第一个字节的编号值,就是这段报文TCP首部序号seq的值。
(2)确认号(acknowledgement number):ack序号,占32位4个字节。表示期待收到对方下一个报文段的序号,那么第一次收到的报文段最后一个字节的编号+1即为确认号。比如第一段报文seq=1(报文第一个字节编号1),报文长度是100,即报文最后一个字节编号为100。确认端接收到发起端发送的报文后,返回给发起端的响应TCP报文中,ACK=1,ack=101,表示发起端发送的1-100编号的字节数据已经收到,希望发起端下一个报文从101编号的字节开始发送。
注意,只有TCP报文的ACK标志位为1时,这个报文中的确认序号字段才有效。
(3)标志位(Flags):TCP标志物有6位,具体如下图
i)确认ACK:占1位,仅当ACK=1时,确认号字段才有效;ACK=0时,确认号无效 。
ii)同步SYN:用于建立连接的同步标记。当SYN=1,ACK=0时表示这是一个连接请求报文段。若同意连接,则在响应报文段中使得SYN=1,ACK=1。因此,SYN=1表示这是一个连接请求报文。
iii)终止FIN:用来释放一个连接。FIN=1表示此报文段的客户端的数据已经发送完毕,并要求释放连接。
这里需要注意2点:
1)不要混淆ACK标志位与ack确认号;
2)SYN这个标志位只有在TCP创建连接时才会被置1,握手完成后SYN标志位被置0。
2、三次握手过程
过程如下图:
注意,此处所谓的“客户端”与“服务器端”,只是为了方便标识连接的双方,即确认哪一方是“要求断开连接”的主动方,哪一方是“要求断开连接”的被动方。事实上任何一方都可能要求建立连接。
步骤如下:
1)首先客户端向服务器端发送一段TCP报文,其中:
i)标记位为SYN=1,表示“请求建立新连接”;
ii)序号为 seq = x,表示客户端发送给服务器端的数据报文的序号是 x ,即数据报文的第一个字节的编号为 x。注意,建立连接的SYN报文虽然没有数据,但是会占用一个序号的大小;
iii)此时,客户端进入 SYNC-SENT 状态:同步已发送状态。
2)服务器端接收到来自客户端 TCP 报文之后,返回一段TCP报文,其中:
i)标志位为 SYN 和 ACK ,ACK=1 是确认标志,表示 “确认客户端的报文seq序号有效,服务器端能正常接收客户端发送的数据。即告诉客户端,服务器端收到了它的请求报文”,SYN=1 是请求连接标志,表示“服务器端同意创建新连接”。ACK与SYN 合起来,就是告诉客户端,服务器端 收到了你的数据,同意与你建立连接;
ii)ack=x+1,表示希望客户端下一次发送回来的数据报序号是 x+1;
iii)seq = y,服务器端向客户端发送自己的数据报,序号是 y。
iv)同时,服务器端结束 LISTEN 监听阶段,进入 SYNC-RCVD 同步已接收状态。
3)客户端接收到来自服务器端的确认收到数据的TCP报文之后,明确了从客户端到服务器端的数据传输是正常的,可以建立连接。返回一段TCP报文,其中:
i)标志位为ACK,表示 “确认收到服务器端同意连接的信号”(即告诉服务器端,我知道你收到我发的数据了);
ii)seq=x+1,表示向服务器端发送序号为x+1的数据,根据第二次握手的 ack=x+1,将seq设置为 x+1;
iii)ack=y+1,表示希望服务器端下一次发送回来的数据报序号为y+1。
iv)随后它会进入 ESTABLISHED 建立连接阶段。
4)服务器端在接收到客户端发送的第三次握手的数据后,也会进入 ESTABLISHED 建立连接阶段。
在“三次握手”中,通过第一、第二次握手的SYN,客户端与服务器端建立连接;而且通过第二、第三次握手的ACK,双方都确认对方已经收到自己的报文。客户端与服务器端的 ack 与 seq 的值,都是在对方 ack 与 seq 值的基础上计算的,即通过“三次握手”,客户端与服务器端也同步了各自的序号与确认号。这样做保证了TCP报文的连贯性,一旦有一方的报文丢失,另一方便无法正确“握手”(因为想正确握手,发出的 seq 需要与对方发来的 ack 相同)。
3、为什么要进行“三次握手”才能建立TCP连接
原因:避免已经失效的连接请求报文传送到服务器端,导致服务器端开启一些无效的连接,增加服务器端开销。
分析如下图:
如果是三次握手,就可以避免上面这种情况的发生,如下图:
4、扩展
在客户端与服务器端建立连接之后,在这个连接上,客户端与服务器端之间可以发送的HTTP请求数量与使用的HTTP协议的版本相关。
1)HTTP1.0版本:TCP连接是在HTTP请求创建的时候同步创建的,HTTP请求发送到服务器端,服务器端响应了之后,这个TCP连接就关闭了。即一次连接只能发送一次HTTP请求;
2)HTTP1.1版本:三次握手建立TCP连接后,以某种方式声明这个连接一直保持,后面的HTTP请求可以继续使用这个连接。
由于在创建一个TCP连接的过程中需要“三次握手”的性能消耗。如果每次HTTP请求都要重新建立TCP连接,那么每次HTTP请求都有“三次握手”的性能消耗。如果使用HTTP1.1,只有第一次请求需要建立连接,后面的请求不需要建立连接,则只有一次“三次握手”的消耗。
TCP协议“三次握手”与“四次挥手”详解(上)的更多相关文章
- TCP协议三次握手与四次挥手详解
在计算机网络的学习中TCPi协议与Http协议是我们必须掌握的内容,其中Tcp协议属于传输层,而Http协议属于应用层,本博客主要讲解Tcp协议中的三次握手与四次挥手,关于Http协议感兴趣的可以参看 ...
- TCP协议“三次握手”与“四次挥手”详解(下)
前面进行“三次握手”建立连接后,当客户端的数据发送完毕,它就会要求与服务器端断开连接,那么就要进行“四次挥手”进行连接的释放. 注意,此处所谓的“客户端”与“服务器端”,只是为了方便标识连接的双方,即 ...
- TCP的三次握手与四次挥手详解
TCP的三次握手与四次挥手是TCP创建连接和关闭连接的核心流程,我们就从一个TCP结构图开始探究中的奥秘 序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序 ...
- TCP的三次握手和四次挥手详解
相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不需要控制这个过程.但是对于理解TCP底层运作机制,相当有帮助. TCP报文格式 TCP的包如下: ...
- TCP三次握手与四次挥手详解
目录 TCP三次握手与四次挥手详解 1.TCP报文格式 2.TCP三次握手 3.TCP四次挥手 4.为什么建立连接需要三次握手? 5.为什么断开连接需要四次挥手? 6.为什么TIME_WAIT状态还需 ...
- TCP/IP的三次握手与四次挥手详解
TCP((Transmission Control Protocol)传输控制协议,是一个面向连接的协议.在运用此协议进行数据传输前都会进行连接的建立工作(三次握手):当数据传输完毕,连接的双方都会通 ...
- TCP三次握手与四次挥手详解(最全面)
目录 TCP的三次握手与四次挥手 TCP报文段的首部格式 TCP的工作原理 TCP 的流量控制 TCP的拥塞控制 拥塞控制与流量控制的关系 拥塞控制所起的作用 慢开始和拥塞避免 慢开始算法的原理 三次 ...
- TCP协议三次握手与四次挥手通俗解析
TCP/IP协议三次握手与四次握手流程解析 一.TCP报文格式 TCP/IP协议的详细信息参看<TCP/IP协议详解>三卷本.下面是TCP报文格式图: 图1 TCP报文格式 上图中有几个字 ...
- [ 转载 ] Tcp三次握手和四次挥手详解
#TCP的报头: 源端口号:表示发送端端口号,字段长为16位.目标端口号:表示接收端口号,字段长为16位.序列号:表示发送数据的位置,字段长为32位.每发送一次数据,就累加一次该数据字节数的大小.注意 ...
随机推荐
- 如何发布自己用python写的py模块
Python——怎么发布你的Python模块 我们在学习Python的时候,除了用pip安装一些模块之外,有时候会从网站下载安装包下来安装,我也想要把我自己编写的模块做成这样的安装包,该怎么办,如何发 ...
- 原生js获取元素的各种位置(大全)
加给元素: offsetLeft (距离定位父级的距离) offsetTop (距离定位父级的距离) offsetWidth (可视宽度) offsetHeight (可视高度) clientLeft ...
- DPDK开发环境搭建(学会了步骤适合各版本)
一.版本的选择 首先要说明的是,对于生产来说DPDK版本不是越高越好,如何选择合适的版本? 1.要选择长期支持的版本LTS(Long Term Support) 2.根据当前开发的系统环境选择 可以在 ...
- mysql全方位知识大盘点
一.mysql都有哪些存储引擎?各自的特点是什么? 引擎 事务 锁 主键 索引 外键 数据结构 适用场景 InnoDB 支持 行锁.表锁 必须有主键,没有设置会自动创建 主键索引和数据在一起,其他索引 ...
- 蓝桥杯 试题 算法提高 宰羊 DP解决
问题描述 炫炫回了内蒙,肯定要吃羊肉啦,所有他家要宰羊吃. 炫炫家有N只羊,羊圈排成一排,标号1~N.炫炫每天吃掉一只羊(这食量!其实是放生啦),吃掉的羊的邻居会以为它被放生了,然后又会告诉他们的邻居 ...
- Istio 将被捐赠给开源基金会 | 云原生生态周报 Vol. 47
作者 | 陈俊.徐迪.陈有坤.李鹏.敖小剑 业界要闻 1.Google Cloud CEO 表示将把 Istio 项目捐赠给基金会 Istio 项目找到了理想的发展方向: 捐赠给开源基金会. 2.Ko ...
- 纯python自研接口自动化脚本更新版本,让小白也能实现0到1万+的接口自动化用例
查看完整文章点击原文链接:纯python自研接口自动化脚本更新版本,让小白也能实现0到1万+的接口自动化用例 你是否还在用postman\jmeter做接口自动化吗?用python的开源框架[unit ...
- 【JavaScript数据结构系列】03-队列Queue
[JavaScript数据结构系列]03-队列Queue 码路工人 CoderMonkey 转载请注明作者与出处 1. 认识队列Queue结构 队列,跟我们的日常生活非常贴近,我们前面举例了食堂排队打 ...
- Java IO(十八) BufferedReader 和 BufferedWriter
Java IO(十八) BufferedReader 和 BufferedWriter 一.介绍 BufferedReader 和 BufferedWriter 是字符缓冲流,分别继承自 Reader ...
- 关于MySQL无法启动的一点问题
今天早上做作业启动MySQL遇到服务无法启动的问题,在网上找方法解决找了一个钟. 修改host文件,重装mysql服务,就差卸载重装了.到后面终于找到问题,原来是我之前改了root密码,所以每次启动m ...