【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.mzph.cn/news/659640.shtml

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

相关文章

机器的大小端存储模式

大、小端字节序 一个整形数据在内存中的存储方式是该数据的补码; 该数据本事的数据是从高地址位到低地址位的,而计算机的内存中刚好相反! 以数字10为例: 补码:0000 0000 0000 0000 0000 0000 0000 1010 补码的十六进制…

windows10设置多个jar后台开机自启

1、window10启动多个jar包的脚本 新建一个txt文档,将以下内容复制到文档中: echo off taskkill /f /im javaw.exe //停用之前启动过的所有后台javaw程序 d: //jar包所在盘符 cd saas //jar包所在文件夹 start cmd /c "title 程序…

Redis简单阐述、安装配置及远程访问

目录 一、Redis简介 1.什么是Redis 2.特点 3.优势 4.数据库对比 5.应用场景 二、 安装与配置 1.下载 2.上传解压 3.安装gcc 4.编译 5.查看安装目录 6.后端启动 7.测试 8.系统服务配置 三、Redis远程访问 1.修改访问IP地址 2.设置登录密码 3.重启Redis服务 …

Maven安装,学习笔记,详细整理maven的一些配置

Maven 1. 初识Maven 2. Maven概述 Maven模型介绍 Maven仓库介绍 Maven安装与配置 3. IDEA集成Maven 4. 依赖管理 01. Maven课程介绍 1.1 课程安排 学习完前端Web开发技术后,我们即将开始学习后端Web开发技术。做为一名Java开发工程师,后端 Web开发技术…

算法练习01——哈希部分双指针

目录 1. 两数之和(*)242. 有效的字母异位词(easy)49. 字母异位词分组(*)349. 两个数组的交集202. 快乐数(1.使用Set存哈希,2.快慢指针)454. 四数相加 II383. 赎金信15. 三数之和*(双指针)18. 四数之和*(双指针)128. 最长连续序列 1. 两数之和(*) https://leetcode.…

Gas Hero Common Heroes NFT 概览与数据分析

作者:stellafootprint.network 编译:mingfootprint.network 数据源:Gas Hero Common Heroes NFT Collection Dashboard Gas Hero “盖世英雄” 是一个交互式的 Web3 策略游戏,强调社交互动,并与 FSL 生态系统集成…

备战蓝桥杯---数据结构与STL应用(入门4)

本专题主要是关于利用优先队列解决贪心选择上的“反悔”问题 话不多说,直接看题: 下面为分析: 很显然,我们在整体上以s[i]为基准,先把士兵按s[i]排好。然后,我们先求s[i]大的开始,即规定选人数…

若依前后端分离集成多数据源SQL Server教程

本章教程,主要介绍如何在若依开源框架前后端分离版本中集成多数据源SQL Server教程。 目录 一、添加依赖 二、修改配置 三、修改代码 四、如何使用 一、添加依赖

asp.net 404页面配置、 asp.net MVC 配置404页面、iis 配置404页面,指定404错误页面,设置404错误页面

通过标题的三个问题 1、asp.net 404页面配置、 2、asp.net MVC 配置404页面、 3、iis 配置404页面; 可以看出,这是一篇了不得的问题,并进行全面讲解; 除了围绕以上三个核心问题外,我们也对以下2个核心场景也作出分析…

【从零开始的rust web开发之路 三】orm框架sea-orm入门使用教程

【从零开始的rust web开发之路 三】orm框架sea-orm入门使用教程 文章目录 前言一、引入依赖二、创建数据库连接简单链接连接选项开启日志调试 三、生成实体安装sea-orm-cli创建数据库表使用sea-orm-cli命令生成实体文件代码 四、增删改查实现新增数据主键查找条件查找查找用户名…

docker-从docker安装到在docker环境中编译程序全流程

1、docker安装 参考:https://blog.csdn.net/weixin_74855005/article/details/135510702 2、基础镜像拉取 以/home/mdj/tools/aarch64-focal为例。 build.bash中的以下命令用来拉arm的ros-noetic镜像,–platform指定操作系统 ros:noetic为基础镜像。 do…

2024.1.31日总结

服创大赛的有一个选题是【A16】新苗同学 - 大学新生智能迎新平台,这个对前端的要求挺高的,需要设计游戏化页面,刚刚搜索了一下,感觉难度很大,又要有创意,而且动画效果也要不错,整体页面才会美观…

爬虫学习笔记-Cookie登录古诗文网

1.导包请求 import requests 2.获取古诗文网登录接口 url https://so.gushiwen.cn/user/login.aspxfromhttp%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx # 请求头 headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like …

kylin启动memcached缓存

当部署kylin的机器内存不足时,可以使用memcached作为kylin的查询缓存。 需要在kylin.properties添加的配置如下: kylin.query.cache-enabledtrue kylin.query.lazy-query-enabledtrue kylin.query.cache-signature-enabledtrue kylin.query.segment-ca…

linux解决访问/下载github连接超时或下载慢的问题

问题 我这里是树莓派从github下载资源出现无法连接,连接超时的问题,如下所示解决方式 修改/etc/hosts文件 例: sudo nano /etc/hosts #添加如下 192.30.255.112 github.com git 185.31.16.184 github.global.ssl.fastly.net这里以树莓派为…

【大厂AI课学习笔记】1.3 人工智能产业发展(4)——泛在的人工智能

人工智能走向泛在。 泛在,就是广泛存在。(下图来自腾讯AI课。) 没办法,被百度抛弃了,想学习,课程打不开,只好投想腾讯的怀抱。 之前考过腾讯云的认证,课程做的还是条理很清晰。 主…

全面掌握Django的web框架Django Rest_Framework(一)

文章目录 Django Rest_Framework1. DRF介绍2.DRF特点3.环境安装与配置(1)DRF需要以下依赖(2)创建django项目 4.序列化器的使用(1)创建序列化器 5. 反序列化器使用 Django Rest_Framework 1. DRF介绍 Djan…

PPT、PDF全文档翻译相关产品调研笔记

主要找一下是否有比较给力的全文档翻译 文章目录 1 百度翻译2 小牛翻译3 腾讯交互翻译4 DeepL5 languagex6 云译科技7 快翻:qtrans8 simplifyai9 officetranslator10 火山引擎翻译-无文档翻译1 百度翻译 地址: https://fanyi.baidu.com/ 配套的比较完善,对于不同行业也有区…

中移(苏州)软件技术有限公司面试问题与解答(7)—— kmalloc与vmalloc的区别与联系及使用场景

接前一篇文章:中移(苏州)软件技术有限公司面试问题与解答(0)—— 面试感悟与问题记录 本文参考以下文章: kmalloc与vmalloc如何选择 Vmalloc与kmalloc的区别 特此致谢! 本文对于中移&#xf…

docker安装elasticsearch+kibana

目录 1.安装es 2.安装kibana 3.kibana监控es 1.安装es 拉取镜像 docker pull elasticsearch:7.6.1 创建存放配置文件、数据、插件的各个文件夹 mkdir -p /home/docker/elasticsearch/config mkdir -p /home/docker/elasticsearch/data mkdir -p /home/docker/elasticsearch…