TCP三次握手详解-深入浅出-程序员宅基地

技术标签: java点滴  tcp/ip  

1. 准备

TCP是属于网络分层中的运输层(有的书也翻译为传输层),因为OSI分为7层,感觉太麻烦了,所以分为四层就好了,简单。
分层以及每层的协议,TCP是属于运输层(有的书也翻译为传输层),如下两张图:

图1 

这里写图片描述

 

TCP三次握手会涉及到状态转换所以这里贴出TCP的状态转换图如下:

这里写图片描述
2.TCP三次握手简述

要想简单了解TCP三次握手,我们首先要了解TCP头部结构,如下:

在这里插入图片描述

 
TCP传递给IP层的信息单位称为报文段或段,下面都用段做单位。

TCP三次握手如图:

这里写图片描述
2.1 第一次握手

客户端给服务器发送一个SYN段(在 TCP 标头中 SYN 位字段为 1 的 TCP/IP 数据包), 该段中也包含客户端的初始序列号(Sequence number = J)。

SYN是同步的缩写,SYN 段是发送到另一台计算机的 TCP 数据包,请求在它们之间建立连接

2.2 第二次握手

服务器返回客户端 SYN +ACK 段(在 TCP 标头中SYN和ACK位字段都为 1 的 TCP/IP 数据包), 该段中包含服务器的初始序列号(Sequence number = K);同时使 Acknowledgment number = J + 1来表示确认已收到客户端的 SYN段(Sequence number = J)。

ACK 是“确认”的缩写。 ACK 数据包是任何确认收到一条消息或一系列数据包的 TCP 数据包

2.3 第三次握手

客户端给服务器响应一个ACK段(在 TCP 标头中 ACK 位字段为 1 的 TCP/IP 数据包), 该段中使 Acknowledgment number = K + 1来表示确认已收到服务器的 SYN段(Sequence number = K)。

2.4 实例观察

2.4.1 tcpdump

使用tcpdump观察如下:因为都是在本机同时运行client和server所以命令为:tcpdump -i lo port 5555, 只能监听回路lo接口,结果如下

这里写图片描述

 如图用红色圈起来的就是3次握手,但是为什么最后一次握手,为什么ack = 1,而不是369535922 呢,
这是因为这里的第三次握手tcpdump显示的是相对的顺序号。但是为了便于观察我们需要把tcpdump的
顺序号变为绝对的顺序号。

命令只需要加-S(大写)便可,即:tcpdump -i lo port 5555 -S
 

加上之后结果就正常了如下图:

这里写图片描述 

从tcpdump的数据,可以明显的看到三次握手的过程是:

  • 第一次握手:client SYN=1, Sequence number=2322326583 —> server
  • 第二次握手:server SYN=1,Sequence number=3573692787; ACK=1, Acknowledgment number=2322326583 + 1 —> client
  • 第三次握手:client ACK=1, Acknowledgment number=3573692787 + 1 -->server

想简单了解一下TCP三次握手的话, 看到这里就可以了.

3.TCP三次握手详细解析过程:

这里写图片描述
3.1 第一次握手

客户在socket() connect()后主动(active open)连接上服务器, 发送SYN ,这时客户端的状态是SYN_SENT
服务器在进行socket(),bind(),listen()后等待客户的连接,收到客户端的 SYN 后,

3.1.1 半连接队列(syn queue)未满

服务器将该连接的状态变为SYN_RCVD, 服务器把连接信息放到半连接队列(syn queue)里面。

3.1.2 半连接队列(syn queue)已满

服务器不会将该连接的状态变为SYN_RCVD,且将该连接丢弃(SYN flood攻击就是利用这个原理,
对于SYN foold攻击,应对方法之一是使syncookies生效,将其值置1即可,路径/proc/sys/net/ipv4/tcp_syncookies,
即使是半连接队列syn queue已经满了,也可以接收正常的非恶意攻击的客户端的请求,
但是这种方法只在无计可施的情况下使用,man tcp里面的解析是这样说的,

这里写图片描述

 但是我不知道为什么Centos6.9默认是置为1,所以这让我很疑惑
这里写图片描述

半连接队列(syn queue)最大值 /proc/sys/net/ipv4/tcp_max_syn_backlog

 这里写图片描述

SYN flood攻击

攻击方的客户端只发送SYN分节给服务器,然后对服务器发回来的SYN+ACK什么也不做,直接忽略掉,
不发送ACK给服务器;这样就可以占据着服务器的半连接队列的资源,导致正常的客户端连接无法连接上服务器。-----[维基百科]

(SYN flood攻击的方式其实也分两种,第一种,攻击方的客户端一直发送SYN,对于服务器回应的SYN+ACK什么也不做,不回应ACK, 第二种,攻击方的客户端发送SYN时,将源IP改为一个虚假的IP, 然后服务器将SYN+ACK发送到虚假的IP, 这样当然永远也得不到ACK的回应。)

3.2 第二次握手

服务器返回SYN+ACK段给到客户端,客户端收到SYN+ACK段后,客户端的状态从SYN_SENT变为ESTABLISHED,
也即是connect()函数的返回。

3.3 第三次握手

全连接队列(accept queue)的最大值 /proc/sys/net/core/somaxconn (默认128)

全连接队列值 = min(backlog, somaxconn)
这里的backlog是listen(int sockfd, int backlog)函数里面的那个参数backlog

3.3.1 全连接队列(accept queue)未满

服务器收到客户端发来的ACK, 服务端该连接的状态从SYN_RCVD变为ESTABLISHED,
然后服务器将该连接从半连接队列(syn queue)里面移除,且将该连接的信息放到全连接队列(accept queue)里面。

3.3.2 全连接队列(accept queue)已满

服务器收到客户端发来的ACK, 不会将该连接的状态从SYN_RCVD变为ESTABLISHED。
当然全连接队列(accept queue)已满时,则根据 tcp_abort_on_overflow 的值来执行相应动作
/proc/sys/net/ipv4/tcp_abort_on_overflow 查看参数值


 tcp_abort_on_overflow = 0

则服务器建立该连接的定时器,

这个定时器是一个服务器的规则是从新发送syn+ack的时间间隔成倍的增加,
比如从新了第二次握手,进行了5次,这五次的时间分别是 1s, 2s,4s,8s,16s,
这种倍数规则叫“二进制指数退让”(binary exponential backoff)

给客户端定时从新发回SYN+ACK即从新进行第二次握手,(如果客户端设定的超时时间比较短就很容易出现异常)


服务器从新进行第二次握手的次数/proc/sys/net/ipv4/tcp_synack_retries

这里写图片描述
 

tcp_abort_on_overflow = 1
关于tcp_abort_on_overflow的解析如下:

这里写图片描述 

 意思应该是,当 tcp_abort_on_overflow 等于1 时,重置连接(一般是发送RST给客户端),
至于怎么重置连接是系统的事情了。
不过我在查资料的过程发现,阿里中间件团队博客说并不是发送RST, —[阿里中间件团队博客]

这个博客跑的实例观察到的是服务器会忽略client传过来的包,然后client重传,一定次数后client认为异常,然后断开连接。
当然,我们写代码的都知道代码是第一手的注释,实践是检验真理的唯一标准,
最好还是自己以自己实践为准,因为可能你的环境跟别人的不一样。)

查看全连接队列(accept queue)的使用情况

这里写图片描述 

如上图,第二列Recv-Q是,全连接队列接收到达的连接,第三列是Send-Q全连接队列的所能容纳最大值,
如果,Recv-Q 大于 Send-Q 那么大于的那部分,是要溢出的即要被丢弃overflow掉的。


感想:
1.本来想写TCP连接的建立和终止的,没想到要讲清楚TCP连接的建立已经很大的篇幅了,就只讲TCP连接的建立而已。
2.以前看书的时候,没有解决一个问题的来的深刻或者说脉络清晰,这个就是主题阅读的好处吧。
3.以前没有养成一个遇到问题深入解析,解决问题的习惯,今后慢慢养成。

下面的参考1有实例,会比较详细一点,清晰一些。
参考:

http://jm.taobao.org/2017/05/25/525-1/
https://coolshell.cn/articles/11564.html
https://zh.wikipedia.org/wiki/SYN_cookie
https://zh.wikipedia.org/wiki/SYN_flood
https://www.cnblogs.com/menghuanbiao/p/5212131.html
 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/jdsjlzx/article/details/123831178

智能推荐

HikariPool-1 - Connection is not available, request timed out after,springboot如何设置连接池大小-程序员宅基地

文章浏览阅读2.6k次。问题描述项目压测的时候一直报错HikariPool-1 - Connection is not available, request timed out after解决方案在yml中配置如下参数hikari: connection-timeout: 60000 idle-timeout: 60000 login-timeout: 5 max-lifetime: 60000 maximum-pool-size: 400 mi

java怎么调用其他包里的类_java怎么调用另一个包中的类-程序员宅基地

文章浏览阅读5.2k次。比如现在有以下两个包:现在想在Boss类里面实现对Employee的调用,怎么做呢?(视频教程推荐:java视频)Employee.java:package payroll2;public class Employee {public void move(){System.out.print("this is employee");}}如果想实现对包的调用,可使用import关键字,然后再用调用类..._java调用其他包的静态类

Linux相关知识-程序员宅基地

文章浏览阅读76次。运行级别 0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动运行运行级别 1:单用户工作状态,root权限,用于系统维护,找回丢失root密码,禁止远程登陆运行级别 2:多用户状态没有网络服务(没有NFS)运行级别 3:多用户状态有网络服务(有NFS),登陆后进入控制台命令行模式运行级别 4:系统未使用保留给用户运行级别 5:图形界面运行级别 6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动常用运行级别是3和5,工作中一般用3,也可以指定默认运行级别。_linux相关

使用S32DS集成S32K的MCAL_s32ds教程-程序员宅基地

文章浏览阅读4.7k次,点赞9次,收藏67次。一、软件准备前往恩智浦官网下载MCAL软件包、EB Tresos 、以及S32DS IDE:以下软件均有NXP免费提供,但需注册账号获取S32DS IDE下载EB Tresos以及MCAL下载S32DS版本为:S32 Design Studio 3.2其中EB Tresos版本为:24.0MCAL版本为:S32K14X_MCAL4_2_RTM_1_0_0​NXP MCAL软件包后缀说明:HF为补丁版本 RTMC为发布版本软件安装请参考:NXP_AUT.._s32ds教程

欧拉法、改进的欧拉法、龙格-库塔法求解初值问题_欧拉法计算初值问题csdn-程序员宅基地

文章浏览阅读1.9w次,点赞37次,收藏202次。求解初值问题简介前期准备欧拉法改进的欧拉法龙格-库塔法三级三阶显式Kutta公式三级四阶显式Heun公式四级四阶显式Kutta公式四级四阶显式Gill公式简介通过求解简单的初值问题:{dudx=f(x,u)(1)u(x0)=u0(2)\begin{cases}\dfrac{du}{dx}=f(x,u)&&&&&&(1)\\u(x_0)=u..._欧拉法计算初值问题csdn

Git取消add 、 commit、push的命令_git 取消add-程序员宅基地

文章浏览阅读2w次,点赞284次,收藏328次。撤销已经add,但是没有commit的问题git reset HEAD撤销已经commit,但是没有push到远端的文件(仅撤销commit 保留add操作)git reset --soft HEAD^查看状态查看没有git add的文件git checkout 查看当前提交状态git status......_git 取消add

随便推点

【企业架构工具】2023 年 18 大企业架构工具_国内ea系统工具-程序员宅基地

文章浏览阅读369次。这些流行和新兴的 EA 工具为企业提供了支持企业架构和数字化转型所需的一切。企业架构系统并不总是必不可少的。据推测,在 1940 年代,国际商业机器公司的一位领导人小托马斯·沃森 (Thomas Watson Jr.) 曾说过:“我认为大约有 5 台计算机的全球市场。” 没有人需要定制软件来跟踪这么短的列表。然而,现代企业则大不相同。一些员工仅在他们的办公桌上就有超过五台计算机。即使是小型组织也可..._国内ea系统工具

计算机专业求职信英语,计算机科学专业毕业生英文求职信范文-程序员宅基地

文章浏览阅读166次。计算机科学专业毕业生英文求职信范文英文求职信范文就求职者是向外企hr介绍自己想要的职位时所写的关于自己的求职信例文。下面小编就为大家推荐计算机科学专业毕业生英文求职信范文。dear mr. ××,i would like to be considered as a candidate for the assistant computer programmer position advertised..._假设你是李华是一所中等职业学校计算机专业的毕业生,你想要一份计算机销售经

Ubuntu18.04中LXC安装配置以及简单使用_lxc-create 离线文件ubuntu-程序员宅基地

文章浏览阅读1.2k次。LXC的安装配置以及简单使用_lxc-create 离线文件ubuntu

Springboot——mybatis配置_springboot配置mybatis-程序员宅基地

文章浏览阅读7.5k次,点赞2次,收藏2次。serverTimezone=Asia/Shanghai:可以实现北京时间入库。_springboot配置mybatis

计算机网络体系结构-程序员宅基地

文章浏览阅读825次,点赞27次,收藏18次。计算机网络分层结构,计算机网络协议、接口、服务的概念

韶音、南卡、Oladance开放式耳机值得买吗?多维度测评实力最强品牌-程序员宅基地

文章浏览阅读846次,点赞18次,收藏12次。作为一名热爱音乐的资深用户,我体验过众多品牌的开放式耳机,希望通过我的评测,能够帮助大家找到最适合自己的耳机。不过,在中高频方面,耳机的表现略显刺耳,音质和音量可能不尽如人意,这可能会对用户的整体听觉体验产生一定影响。不过,延迟性相对较高,对于需要实时音视频同步的场景,如追剧或游戏,可能不太适合,存在明显的延迟问题。然而,在使用这项技术的耳机时,尤其是在游戏过程中,可能会遇到较高的延迟问题,这可能导致音画不同步的现象更加明显。然而,在剧烈运动时,耳机的稳固性可能需要加强,以避免因动作过大而导致脱落。