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
随机推荐
- Vulnhub DC-4靶机渗透
信息搜集 nmap -sP 192.168.146.0/24 #扫网段看看存活的主机,找到靶机 nmap -sS -Pn -A 192.168.146.141 可以看到开放了22和80端口,那么就可以 ...
- Scrapy-01-追踪爬取
目的:利用scrapy完成盗墓笔记小说的抓取 创建项目: scrapy startproject books cd books scrapy genspider dmbj 编写p ...
- 实时OLAP分析利器Druid介绍
文章目录 前言 Druid介绍 主要特性 基础概念 数据格式 数据摄入 数据存储 数据查询 查询类型 架构 运维 OLAP方案对比 使用场景 使用建议 参考 近期主题 前言 项目早期.数据(报表分析) ...
- 了解一下mock
1.mock简介: mock测试就是在测试过程中,对于某些不容易构成或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法,mock是在测试过程中,对于一些不容易构造/获取的对象,创建一个mo ...
- vue(element)中使用codemirror实现代码高亮,代码补全,版本差异对比
vue(element)中使用codemirror实现代码高亮,代码补全,版本差异对比 使用的是vue语言,用element的组件,要做一个在线编辑代码,要求输入代码内容,可以进行高亮展示,可以切换各 ...
- 2019-05-12 Python之模拟体育竞赛
一.简介 可以选择任意规则,模拟不同的两个队伍进行球赛的模拟比赛 二.源代码 函数介绍: from random import * #输出介绍信息 def printIntro(): print(&q ...
- 天天在用Redis,持久化方案你又知道哪些?
前言 文章首发于微信公众号[码猿技术专栏]:天天用Redis,持久化方案有哪些你知道吗? Redis目前已经成为主流的内存数据库了,但是大部分人仅仅是停留在会用的阶段,你真的了解Redis内部的工作原 ...
- 记一次错误 POST http://127.0.0.1:8000/auth/signup/ 500 (Internal Server Error)
错误环境: 1,ajax 发送 post 请求调用 views 的视图 xfzajax.post({ 'url': '/xfzauth/signup/', 'data': { 'telephone': ...
- Netty 中的异步编程 Future 和 Promise
Netty 中大量 I/O 操作都是异步执行,本篇博文来聊聊 Netty 中的异步编程. Java Future 提供的异步模型 JDK 5 引入了 Future 模式.Future 接口是 Java ...
- Obtain The String CodeForces - 1295C binary_search+思维
妈耶,,,被B题卡到哭,C题一发就过了... 字符串问题.首先用vector记录每个字符出现的位置,然后对字符串t的每个字符,用二分查找函数查找,注意用upper_bound查找,对于字符i,首先用变 ...