【TCP】三次握手(建立连接)

图片

前言

在网络通信的世界里,可靠传输协议(TCP)扮演着重要的角色,它保证了数据包能够按顺序、完整地从发送端传送到接收端。TCP协议中有一个至关重要的机制——三次握手。这一过程确保了两个TCP设备在开始数据传输之前建立起一个稳定的连接。

握手之前的准备工作 

在TCP协议下,客户端与服务端之间的通信前,两者都需要进行一系列的初始化工作。客户端需要配置自己的IP地址和端口号,同时获知服务器的IP地址和监听端口。服务端则需设置好自己的IP地址和端口号,并启动监听进程,以便响应客户端的连接请求。这些准备工作是后续握手流程顺利进行的基础。

图片

第一次握手:SYN

第一次握手由客户端发起,它向服务端发送一个带有SYN(同步序列编号)标志的数据包,以表示希望建立连接。这个数据包还包含一个随机的序列号X,用于后续的数据同步。此时,客户端进入SYN_SENT状态。

第二次握手:SYN-ACK

服务端收到客户端的SYN包后,会确认客户端的请求,并回送一个带有SYN和ACK(确认)标志的数据包。这个数据包不仅确认收到了客户端的请求,而且包含了服务端的初始序列号Y,同时也携带一个确认号X+1,表示已经准备好接收客户端接下来的数据。此时,服务端进入SYN_RECEIVED状态。

第三次握手:ACK

最后,客户端收到服务端的SYN-ACK包后,会发送一个仅带有ACK标志的数据包作为应答,其中的确认号为Y+1,表明已经准备好接收服务端的数据。当服务端收到这个ACK包后,双方便完成了连接的建立,进入了ESTABLISHED状态,可以开始正式的数据传输。

TCP三次握手的步骤

图片

  1. 客户端发送SYN包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认。

  2. 服务器收到SYN包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。

  3. 客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

完成三次握手后,客户端与服务器开始传送数据。为了提供可靠的传送,TCP在发送新的数据之前,以特定的顺序将数据包的序号,并需要这些包传送给目标机之后的确认消息。

以下是一个简单的Java代码示例,使用Socket类模拟TCP三次握手(建立连接)的过程:

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;public class TcpHandshakeDemo {public static void main(String[] args) {// 服务器端try (ServerSocket serverSocket = new ServerSocket(8080)) {System.out.println("服务器端等待客户端连接...");Socket socket = serverSocket.accept(); // 等待客户端连接System.out.println("客户端已连接");} catch (IOException e) {e.printStackTrace();}// 客户端try (Socket socket = new Socket("localhost", 8080)) {System.out.println("客户端已连接到服务器");} catch (IOException e) {e.printStackTrace();}}
}

TCP为什么需要三次握手

TCP需要三次握手的主要原因是防止旧的重复连接引起连接混乱问题,以及同步初始化序列号。在网络状况比较复杂或者网络状况比较差的情况下,发送方可能会连续发送多次建立连接的请求。如果TCP握手的次数只有两次,那么接收方只能选择接受请求或者拒绝接受请求,但它并不清楚这次的请求是正常的请求,还是由于网络环境问题而导致的过期请求,如果是过期请求的话就会造成错误的连接。三次握手可以实现TCP初始化序列号的确认工作,TCP需要初始化一个序列号来保证消息的顺序。如果是两次握手则不能确认序列号是否正常,如果是四次握手的话会浪费系统的资源,因此TCP三次握手是最优的解决方案。

TCP头结构

TCP头结构是TCP数据包的重要组成部分,包含了TCP通信所需的各种信息。TCP头结构包括以下字段:

  • 序号(Sequence Number):用于标识TCP段中的字节流。

  • 确认号(Acknowledgment Number):用于确认收到对方的数据段。

  • 数据偏移(Data Offset):指示数据段中的TCP头长度。

  • 保留(Reserved):保留字段供将来使用。

  • 标志位(Flags):包括URG、ACK、PSH、RST、SYN和FIN等标志。

  • 窗口大小(Window Size):用于流量控制和拥塞控制。

  • 校验和(Checksum):用于检测数据传输过程中的错误。

  • 紧急指针(Urgent Pointer):用于指示紧急数据的位置。

  • TCP选项(TCP Options):可选字段,包括最大段大小、窗口缩放因子等。

图片

SYN的基本原理

SYN的基本原理涉及到TCP协议中的连接建立过程,即三次握手机制。在这个过程中,SYN(同步序列编号)标志位发挥着至关重要的作用。

首先,SYN标志位用于同步序号,在TCP连接建立的第一次握手中,客户端会向服务端发送一个SYN包,该包包含随机生成的序列号X,表明客户端希望开始建立连接。服务端收到后,会确认客户端的SYN(第二次握手),并回送一个SYN-ACK包,其中也包含服务端的初始序列号Y,同时携带一个确认号X+1,表示已经准备好接收客户端接下来的数据。最后,客户端发送ACK包作为应答(第三次握手),其中的确认号为Y+1,表明已经准备好接收服务端的数据。完成这三次握手后,双方便建立了连接,可以开始数据传输。

其次,SYN还与网络安全中的SYN攻击有关。SYN攻击是一种拒绝服务攻击(DoS攻击),攻击者通过发送大量的SYN包来耗尽目标服务器的资源,导致正常的服务请求无法得到响应。为了防止这种攻击,一些系统采用了SYN Cookie技术,即在收到SYN包时,服务器不立即分配资源,而是先发送一个带有特定Cookie值的SYN-ACK包。真实的客户端会回应一个ACK包,其中的确认号是Cookie值加1,这时服务器才会分配资源,从而有效抵御伪造的SYN包攻击。

总的来说,SYN标志位是TCP协议中确保数据同步和连接建立的关键要素,同时也是网络安全防护中需要特别注意的部分。通过理解SYN的工作原理,我们可以更好地把握网络通信的安全性和稳定性。

结语 

TCP三次握手是一个精心设计的机制,它不仅确保了网络连接的稳定性和可靠性,也避免了因过时或重复的连接请求而导致的资源浪费。了解三次握手的原理和TCP头的结构,有助于深入理解网络协议的工作方式,对于网络工程师而言,这是掌握网络通信基础的关键一步。

图片

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

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

相关文章

【Qt/UI美化实战课程】课程首发 (布局/样式表/高级控件/图标字体/图表曲线/仪表盘/精美换肤)

视频先行:详细视频介绍可以看下B站讲解 【QT/UI美化实战课程】课程首发 (布局/样式表/高级控件/图标字体/图表曲线/仪表盘/精美换肤) 1. 课程包含哪些干货? 1.1 无边框窗口(11讲) 实现的无边框窗口,支持以…

2024上海国际跨境电商及户外源头工厂选品展览会

2024上海国际跨境电商及户外源头工厂选品展览会 时间:2024年09月5-7日 地点:上海世博展览馆 详询主办方陆先生 I38(前三位) I82I(中间四位) 9I72(后面四位) 展会介绍&#xff…

PostGIS教程学习二十二:使用触发器追踪历史编辑操作

PostGIS教程学习二十二:使用触发器追踪历史编辑操作 生产环境下数据库的一个常见要求是能够跟踪用户编辑数据的历史:数据在两个日期之间是如何变化的,是谁操作的,以及它们哪些内容变化了?一些GIS系统通过在客户端接口…

如何实现一个百万亿规模的时序数据库,百度智能云 BTS 架构解析和实践分享

本文整理自 2023 年 12 月 16 日,百度智能云数据库总架构师朱洁在《国产数据库共话未来趋势》技术沙龙上的主题分享。 随着互联网和物联网的高速发展,产生了大量的结构化、半结构化数据。在百度集团内部, BTS(Baidu Table Storage…

windows pm2 执行 npm脚本或执行yarn脚本遇到的问题及解决方案

环境: 在windows上启动终端来运行一个项目;通过指令npm run start来启动,但是将终端一关,就无法访问了,所以想到用pm2来管理 1. 全局安装pm2 npm i pm2 -g2. 在项目根目录执行指令(大部分兄弟的错误使用方法) pm2 st…

JMeter 下载、安装、启动

JMeter安装部署依赖Java环境,所以首先得安装JDK。 JDK下载JDK环境变量配置 ① 新建系统环境变量JAVA_HOME ② 编辑系统变量Path ③ 新建系统变量CLASSPATH变量 JMeter下载安装 Apache JMeter - Apache JMeter™ JMeter安装部署依赖Java环境,所以首…

电脑闹钟怎么设置?分享4个简单方法!

“我想用电脑来设置一个闹钟,但是不知道应该怎么操作,有哪位朋友知道电脑闹钟怎么设置吗?希望可以帮帮我!” 在日常生活中,我们经常需要设置闹钟来提醒我们重要的时间节点。而电脑作为我们日常使用的工具,其…

CentOS gui 图形界面显示文字乱码

一、现象 CentOS(CentOS 7.5)控制台下显示中文乱码: 或者通过X11 Forwarding远程显示CentOS的图形化程序文字乱码: 二、解决方法 安装中文语言包: yum install kde-l10n-Chinese 注:网上有些文章会推荐安…

【网络】端口号范围

一、端口号的几个范围 在计算机网络中,一个端口号是一个16位的无符号整数,意味着端口号的范围是从0到65535。不过,并非所有端口都可以随意使用。根据惯例和技术标准,端口号被分为几个范围:1. 系统或保留端口&#xff…

MATLAB知识点:常见的数学运算函数

​讲解视频:可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili 节选自第2章 大家可以打开本节的配套代码:“cod…

sqlmap的使用

2024.1.31 sqlmap支持五种不同的注入模式&#xff1a; 1、布尔盲注2、时间盲注3、报错注入4、联合注入5、堆叠注入 检测注入 GET请求的基本格式 ​python sqlmap.py -u <测试网址> Ps:不知道为什么我的sqlmap使用时前面要加python&#xff0c;而大部分其他教程没提到…

雷达DoA估计的跨行业应用--麦克风阵列声源定位(Matlab仿真)

一、概述 麦克风阵列&#xff1a; 麦克风阵列是由一定数目的声学传感器&#xff08;麦克风&#xff09;按照一定规则排列的多麦克风系统&#xff0c;而基于麦克风阵列的声源定位是指用麦克风拾取声音信号&#xff0c;通过对麦克风阵列的各路输出信号进行分析和处理&#xff0c;…