TCP 3-Way Handshake
TCP是面向连接的协议,其数据传输过程分为建立连接、数据传送、释放连接三个阶段。
0 建立连接
建立连接的过程也就是常说的“三次握手”:
- 客户端向服务器端发送一个SYN报文(SYN=1表示这是一个连接请求或连接接收报文),并随机选取一个起始序号x;
- 服务器端应答一个SYN报文,同时ACK(确认位)置1【ACK=1时TCP报文段首部中的ack(确认号字段)才有效】,随机选取一个服务器端的起始序号y,并将ack字段设为x+1,表示已经收到客户端发来的SYN报文,期待收到序号为x+1的下一个报文;
- 客户端应答一个ACK报文,将序号设为x+1,并且ack字段设为y+1,表示已经收到服务器端的SYN报文,期待收到序号为y+1的下一个报文。
注:序列号seq也称ISN(Initial Sequence Number)

之所以要采用三次握手机制而不是两次或四次,要从握手机制的目的说起:
握手主要是为了确认双方的发送、接收能力是否正常,顺带初始化序号seq,为以后的数据传送做好准备,所以:
第一次握手:服务器收到客户端发来的网络包,服务器就明白客户端的发送能力、服务器的接收能力正常;
第二次握手:服务器发包,客户端收到后,客户端就明白服务器的发送、接收,客户端的发送、接收都是正常的;
二次握手后,客户端倒是全明白了,但是服务器端无法确认客户端能否正常接收、服务器是否正常发送,所以两次握手不够;
第三次握手:服务器收到客户端发送的网络包,服务器确认了自己上次的发送正常、客户端接收也正常,所以四次握手是多余的。
1 补充问题
- 序列号(ISN)之所以随机生成,是为了避免被攻击(若固定,则下一次传送的ack就显而易见);
- 前两次握手不可以携带数据,第三次可以携带。第一次握手服务器端接收能力未知,如果携带数据就可能丢失。第二次客户端接收能力未知,如果携带数据也可能丢失。第三次客户端知道服务器接收正常,并且自己已经处于ESTABLISHED状态;
- 服务器发出SYN报文后,处于SYN-RCVD状态,此时不同的连接请求会被放在半连接队列里,三次握手完成后的连接请求被放在全连接队列里。
2 连接释放
连接释放的过程也就是常说的“四次挥手”:
P.S. 图中以客户端发起释放请求为例
- 客户端发送释放请求,将FIN(终止位)置1,表示客户端已经发完数据,请求释放;
- 服务器发一个ACK报文,确认号ack为u+1,这时从客户端到服务器的连接被释放,处于半关闭状态;
- 如果服务器也要断开连接,就向客户端发送连接释放报文(FIN=1);
- 客户端发送一个应答报文,序列号seq为u+1,等待一段时间(2MSL)确保服务器收到ACK报文,之后关闭连接。

客户端之所以要等待2MSL时间才关闭,有两个原因:
- 一旦服务器没有收到ACK报文,服务器就会重发FIN报文,客户端再次收到FIN报文,就知道之前发送的ACK报文丢失,会重置时间等待计时器为2MSL并重传ACK报文。
如果没有这段等待时间,万一服务器没有正常接收ACK报文,接下来重传的FIN报文段就无法到达客户端,服务器无法正常关闭。 - 客户端发完最后一个ACK报文,经过2MSL,本次连接产生的报文都会从网络中消失,避免下一次新连接出现本次旧的连接请求报文段。
TCP 3-Way Handshake的更多相关文章
- TCP Connection Establishment and Termination
Three-Way Handshake The following scenario occurs when a TCP connection is established: The server m ...
- 基于TCP协议的网络通讯流程
不多说了,先上个图: 从上面的图中可以看出来,基于TCP协议进行通讯可以大致分成以下几个阶段: 1. 首先是在服务器端, TCP Sever调用socket(), bind(), listen()完成 ...
- FW 常见的性能测试工具有: loadRunner/netperf/httperf/apache_ab/Apache JMeter
常见的性能测试工具有: loadRunner/netperf/httperf/apache_ab/Apache JMeter , 其中loadRunner属于付费软件,所以在这里不做介绍 netper ...
- 内网内使用https 和 使用http 建立连接的速度对比
文字版 使用https httpstat https://10.24.101.14/cwbase/web/Login.aspx --insecure Connected to HTTP/ OK Ser ...
- httpstat的简单使用
httpstat 应该是一个 python 封装后的 curl 工具能够展现 一些客户端连接网站的时间消耗,最近在看tls 感觉挺有用处的 简单学习一下 1. centos7 安装python 和 p ...
- The POSIX API/nss/nscd
https://code.google.com/p/nsscache/wiki/BackgroundOnNameServiceSwitch The POSIX API POSIX is a stand ...
- The TCP three-way handshake (connect)/four wave (closed)
TCP, relative to the SOCKET developers create process and link remove process consists of the TCP/IP ...
- TCP Three-way Handshake
TCP Connection Management Out-of-Order and Duplication(复制) Problem Old segment from previous connect ...
- TCP 3-Way Handshake (SYN,SYN-ACK,ACK)
http://www.inetdaemon.com/tutorials/internet/tcp/3-way_handshake.shtml
随机推荐
- 为什么条件变量需要传入mutex?
条件变量一般而言,会有一个布尔表达式作为唤醒的条件.调用wait的线程需要读取这个布尔表达式内数据, 同样,调用signal的线程需要修改这个布尔表达式的数据,让表达式为真.故而这两个线程必然访问至少 ...
- Jquery的$.get(),$.post(),$.ajax(),$.getJSON()用法详细解读
1.$.get $.get()方法使用GET方式来进行异步请求,它的语法结构为: $.get( url [, data] [, callback] ) 解释一下这个函数的各个参数: url:strin ...
- python3(五) if
age = 20 if age >= 18: print('your age is', age) print('adult') # 如果if语句判断是True,就把缩进的两行print语句执行了 ...
- Kubernetes 二进制部署
目录 1.基础环境 2.部署DNS 3.准备自签证书 4.部署Docker环境 5.私有仓库Harbor部署 6.部署Master节点 6.1.部署Etcd集群 6.2.部署kube-apiserve ...
- MD5中使用16进制
MD5中使用16进制消息摘要 分类: java_secruity2012-12-28 13:11 719人阅读 评论(0) 收藏 举报 消息摘要 由于数据在计算机中的表示,最终以二进制的形式存在,所以 ...
- Xor Path 牛客,HPU--C--LCA
题解: 题目要求求出u和v两点在最短路径上的异或和.怎么确定最短路径呢?,就是U到LCA(u,v)的路径加上V到LCA(u,v).根据异或的性质,如k^a^a=k,即异或一个值两边等于原数值. 所以维 ...
- E1. Send Boxes to Alice (Easy Version)
题解: 保存每个1的位置.然后记录1的总个数cnt,如果存在一个k使得这个k是每个集合的倍数,那么为了使操作次数最小,这个k应该是cnt的质因子.(因为都是每个集合的数目1,使每个集合的数目变为2需要 ...
- 利用Putty建立SSH的tunnels访问内网资源
适用场景访问阿里或者腾讯云只针对内网开放的资源. 本文以SQLSERVER 举例 举例你的内网 SQLSERVER的访问地址是192.168.33.88 . 你的Microsoft SQL Serve ...
- 实现一个简单的基于动态代理的 AOP
实现一个简单的基于动态代理的 AOP Intro 上次看基于动态代理的 AOP 框架实现,立了一个 Flag, 自己写一个简单的 AOP 实现示例,今天过来填坑了 目前的实现是基于 Emit 来做的, ...
- Springboot:修改默认端口以及Logo(三)
端口修改 在application.yml文件中增加端口的配置: server: port: 8081 Logo修改 Logo生成网址: https://www.bootschool.net/asci ...