重学TCP协议(4) 三次握手

1. 三次握手

image.png

  1. 请求端(通常称为客户)发送一个 S Y N段指明客户打算连接的服务器的端口,以及初始序号。这个S Y N段为报文段1。
  2. 服务器发回包含服务器的初始序号的 S Y N报文段(报文段2)作为应答。同时,将确认序号设置为客户的I S N加1以对客户的S Y N报文段进行确认。一个S Y N将占用一个序号。
  3. 客户必须将确认序号设置为服务器的 I S N加1以对服务器的S Y N报文段进行确认(报文段3)。

除了交换彼此的初始序列号,三次握手的另一个重要作用是交换一些辅助信息,比如最大段大小(MSS)、窗口大小(Win)、窗口缩放因子(WS)、是否支持选择确认(SACK_PERM)等

1.1 初始序列号(Initial Sequence Number, ISN)

初始的序列号并非从 0 开始,通信双方各自生成,一般情况下两端生成的序列号不会相同。生成的算法是 ISN 随时间而变化,会递增的分配给后续的 TCP 连接的 ISN。

1.1.1 ISN 能设置成一个固定值呢?

1、出于安全性考虑。如果被知道了连接的ISN,很容易构造一个在对方窗口内的序列号,源 IP 和源端口号都很容易伪造,这样一来就可以伪造 RST 包,将连接强制关闭掉了。如果采用动态增长的 ISN,要想构造一个在对方窗口内的序列号难度就大很多了。

2、因为开启 SO_REUSEADDR 以后端口允许重用,收到一个包以后不知道新连接的还是旧连接的包因为网络的原因姗姗来迟,造成数据的混淆。如果采用动态增长的 ISN,那么可以保证两个连接的 ISN 不会相同,不会串包。

RFC 793指出I S N可看作是一个3 2比特的计数器,每4 m s加1。这样选择序号的目的在于防止在网络中被延迟的分组在以后又被传送,而导致某个连接的一方对它作错误的解释。

1.2 三次握手的状态变化

image.png

  • 对于客户端而言:
  1. 初始的状态是处于 CLOSED 状态。CLOSED 并不是一个真实的状态,而是一个假想的起点和终点。

  2. 客户端调用 connect 以后会发送 SYN 同步报文给服务端,然后进入 SYN-SENT 阶段,客户端将保持这个阶段直到它收到了服务端的确认包。

  3. 如果在 SYN-SENT 状态收到了服务端的确认包,它将发送确认服务端 SYN 报文的 ACK 包,同时进入 ESTABLISHED 状态,表明自己已经准备好发送数据。

  • 对于服务端而言:
  1. 初始状态同样是 CLOSED 状态
  2. 在执行 bind、listen 调用以后进入 LISTEN状态,等待客户端连接。
  3. 当收到客户端的 SYN 同步报文以后,会回复确认同时发送自己的 SYN 同步报文,这时服务端进入 SYN-RCVD 阶段等待客户端的确认。
  4. 当收到客户端的确认报文以后,进入ESTABLISHED 状态。这时双方可以互相发数据了

image.png

1.3 同时打开的状态变化

两个应用程序同时彼此执行主动打开的情况是可能的,尽管发生的可能性极小。每一方必须发送一个 S Y N,且这些S Y N必须传递给对方。这需要每一方使用一个对方熟知的端口作为本地端口。这又称为同时打开( simultaneous open)

例如,主机A中的一个应用程序使用本地端口 7 7 7 7,并与主机B的端口8 8 8 8执行主动打开。主机B中的应用程序则使用本地端口 8 8 8 8,并与主机A的端口7 7 7 7执行主动打开。

这与下面的情况不同:主机A中的Te l n e t客户程序和主机B中Te l n e t的服务器程序建立连接,与此同时,主机 B中的Te l n e t客户程序与主机A的Te l n e t服务器程序也建立连接。在这个 Te l n e t例子中,两个Te l n e t服务器都执行被动打开,而不是主动打开,并且 Te l n e t客户选择的本地端
口不是另一端Te l n e t服务器进程所熟悉的端口。

T C P是特意设计为了可以处理同时打开,对于同时打开它仅建立一条连接而不是两条连

两端几乎在同时发送 S Y N,并进入S Y N _ S E N T状态。当每一端收到 S Y N时,状态变为S Y N _ R C V D,他们都再发S Y N并对收到的S Y N进行确认。当双方都收到 S Y N及相应的A C K时,状态都变迁为E S TA B L I S H E D。图1 8 - 1 7显示了这些状态变迁过程。

image.png

参考资料

《深入理解 TCP 协议:从原理到实战》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/391320.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[设计模式]State模式

《Java与模式》 又称状态对象模式。状态模式是对象的行为模式。GOF95 一个对象的行为取决于一个或者多个动态变化的属性,这样的属性叫做状态。这样的对象叫做有状态的对象(stateful)。 状态模式把一个所研究的对象的行为包装在不同的状态对象…

java温故笔记(二)java的数组HashMap、ConcurrentHashMap、ArrayList、LinkedList

为什么80%的码农都做不了架构师?>>> HashMap 摘要 HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。随着JDK(Java Developmet Kit)版本的更新,JDK1.8对HashMap底层的实现进行了优化,例…

前置交换机数据交换_我们的数据科学交换所

前置交换机数据交换The DNC Data Science team builds and manages dozens of models that support a broad range of campaign activities. Campaigns rely on these model scores to optimize contactability, volunteer recruitment, get-out-the-vote, and many other piec…

aws 弹性三剑客_AWS和弹性:超越用户需求

aws 弹性三剑客I’ll assume that, one way or another, you’re already familiar with many of AWS’s core deployment services. That means you now know about:我假设您已经熟悉许多AWS的核心部署服务。 这意味着您现在知道: • EC2 instances and AMIs (Ama…

leetcode 368. 最大整除子集(dp)

给你一个由 无重复 正整数组成的集合 nums ,请你找出并返回其中最大的整除子集 answer ,子集中每一元素对 (answer[i], answer[j]) 都应当满足: answer[i] % answer[j] 0 ,或 answer[j] % answer[i] 0 如果存在多个有效解子集&a…

在Centos中安装mysql

下载mysql这里是通过安装Yum源rpm包的方式安装,所以第一步是先下载rpm包 1.打开Mysql官网 https://www.mysql.com/, 点击如图选中的按钮 点击如图框选的按钮 把页面拉倒最下面,选择对应版本下载,博主这里用的是CentOS7 下载完成后上传到服务器,由于是yum源的安装包,所以…

硕士可以跟别的导师做实验吗_如何成为一名导师可以成为双刃剑

硕士可以跟别的导师做实验吗Mentoring is the ability to give advise or train someone, often times, who is less knowledgeable in a particular field. This is pretty much common place in tech companies. There you usually have senior developers who, besides bein…

linux中权限对文件和目录的意义

1.权限对文件的意义: 读:可查看文件的内容 写:可修改文件的内容(但不能删除文件) 执行:可执行文件 2.权限对目录的意义: 读:可以查看目录下的内容,即可以读取该目录下的结…

Docker 入门(1)虚拟化和容器

1 虚拟化 虚拟化是为一些组件(例如虚拟应用、服务器、存储和网络)创建基于软件的(或虚拟)表现形式的过程。它是降低所有规模企业的 IT 开销,同时提高其效率和敏捷性的最有效方式。 1.1 虚拟化用于程序跨平台兼容 要…

量子相干与量子纠缠_量子分类

量子相干与量子纠缠My goal here was to build a quantum deep neural network for classification tasks, but all the effort involved in calculating errors, updating weights, training a model, and so forth turned out to be completely unnecessary. The above circu…

三角函数式的化简

前言 为什么需要化简三角函数式? 一、什么是三角函数式的化简? 二、三角函数式的化简标准是什么? 三、三角函数式化简可能用到的变形: 弦切互化,1的代换,通分约分,配方展开,提取公因…

Python -- xlrd,xlwt,xlutils 读写同一个Excel

最近开始学习python,想做做简单的自动化测试,需要读写excel,然后就找到了xlrd来读取Excel文件,使用xlwt来生成Excel文件(可以控制Excel中单元格的格式),需要注意的是,用xlrd读取excel是不能对其进行操作的&…

计算机工程师分级_这些是每个计算机工程师都应该知道的数字

计算机工程师分级In 2010, Jeff Dean from Google gave a wonderful talk at Stanford that made him quite famous. In it, he discussed a few numbers that are relevant to computing systems. Then Peter Norvig published those numbers for the first time on the inter…

leetcode 377. 组合总和 Ⅳ(dp)

给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。 题目数据保证答案符合 32 位整数范围。 示例 1: 输入:nums [1,2,3], target 4 输出:7 解释&…

1.4- 定时任务总结之九句箴言

1.4定时任务之九句箴言九句箴言---- 不会九句箴言别做运维1.定时任务规则之前加注释2.使用脚本代替命令行制定定时任务3.定时任务中date命令%的特殊含义定时任务中,%表示回车 -----可以使用\转义4.运行脚本一定要用/bin/sh或sh脚本不必须有x权限5.定时任务中-命令或脚本的输出…

ubuntu 18.04 vi里面方向键变成abcd 处理办法

sudo apt-get remove vim-common sudo apt-get install vim 转载于:https://www.cnblogs.com/testing-BH/p/11506400.html

知识力量_网络分析的力量

知识力量The most common way to store data is in what we call relational form. Most systems get analyzed as collections of independent data points. It looks something like this:存储数据的最常见方式是我们所谓的关系形式。 大多数系统作为独立数据点的集合进行分析…

python里的apply,applymap和map的区别

apply,applymap和map的应用总结:apply 用在dataframe上,用于对row或者column进行计算;applymap 用于dataframe上,是元素级别的操作;map (其实是python自带的)用于series上,是元素级别的操作。如…

验证曲线和学习曲线_如何击败技术学习曲线的怪物

验证曲线和学习曲线Doing what I do for a living, which these days mostly involves creating technology books and courseware, I’m constantly learning new technologies. In a way, my new tech adventures are not much different than the ones most IT pros face, e…

234

234 转载于:https://www.cnblogs.com/Forever77/p/11509588.html