【从零开始学习JAVA | 第四十四篇】TCP协议中的握手与挥手

news2024/9/23 17:14:57

前言:

TCP(传输控制协议)作为计算机网络中的重要协议,扮演着确保数据可靠传输的角色。在TCP的通信过程中,握手与挥手问题是不可忽视的关键环节。握手是指在建立连接时,客户端与服务器相互确认彼此的身份并同步参数,确保双方准备就绪;而挥手则是在终止连接时,双方相互告知对方自己的意愿,保证连接的安全关闭。本文将深入探讨TCP协议中握手与挥手问题的细节与作用,以期更好地理解和应用TCP协议。 

TCP中的握手:

TCP的三次握手是建立TCP连接的过程,确保客户端和服务器之间的通信能够可靠进行。

  1. 第一次握手(SYN):
    客户端向服务器发送一个SYN包(同步请求),包含一个随机的初始序列号。这个包告诉服务器客户端想要建立连接,并等待服务器的确认。

  2. 第二次握手(SYN-ACK):
    服务器收到客户端的SYN包后,会发送一个SYN-ACK包(同步-确认)。这个包中既确认了客户端的请求(ACK),也向客户端发送了一个随机的初始序列号。服务器告诉客户端,服务器愿意接受连接请求,并等待客户端的确认。

  3. 第三次握手(ACK):
    客户端收到服务器的SYN-ACK包后,向服务器发送一个ACK包(确认)。这个包中的确认号是服务器发送的初始序列号加1,表示客户端已收到服务器的回应。客户端确认了服务器的连接请求,并告诉服务器可以开始进行数据传输。

在完成三次握手后,TCP连接建立成功,双方可以开始进行数据的可靠传输。这个三次握手的过程确保了双方都能确认对方的存在、同步序列号,并建立起可靠的连接。

TCP中的挥手:

  1. 第一次挥手(FIN):
    当客户端决定关闭连接时,它会向服务器发送一个FIN包(终止请求)。客户端不再发送数据,但仍然可以接收服务器发送的数据。

  2. 第二次挥手(ACK):
    服务器在收到客户端的FIN包后,发送一个ACK包(确认)。此时,服务器进入半关闭状态,即只能发送数据,而不能再接收数据。

  3. 第三次挥手(FIN):
    在服务器发送完所有数据后,它会向客户端发送一个FIN包(终止请求)。服务器告诉客户端它准备关闭连接,不再发送数据。

  4. 第四次挥手(ACK):
    客户端收到服务器的FIN包后,发送一个ACK包(确认)。客户端告诉服务器它收到了终止请求,并确认可以关闭连接。

在完成四次挥手后,TCP连接彻底关闭。这个过程确保了双方都有机会发送和接收最后的数据,并最终正确地关闭连接。这样可以保证数据的完整性,防止数据丢失或混淆。四次挥手是TCP连接的安全终止过程。

常见异常:

  1. 连接超时:
    当客户端发送SYN包后,如果在一定时间内没有收到服务器的响应(SYN-ACK包),则可能会触发连接超时异常。这可能是由于网络延迟、服务器负载过高或网络故障等原因导致的。

  2. SYN洪泛攻击:
    SYN洪泛攻击是一种网络攻击,攻击者发送大量伪造的SYN包给服务器,导致服务器耗尽资源无法正常响应正常用户的连接请求。这可能导致正常的握手过程受阻或延迟。

  3. 半连接队列溢出:
    当服务器处于高负载状态时,如果客户端发送的连接请求超过服务器所能处理的容量,可能会导致半连接队列溢出。这会导致服务器无法接受新的连接请求,从而导致握手失败。

  4. 异常关闭:
    在握手或挥手过程中,如果一方突然关闭或终止了连接,而另一方仍然期望继续通信,就会发生异常关闭的情况。这可能导致连接的一方无法正常完成挥手过程,需要通过超时机制来处理异常关闭。

  5. 重复的ACK或FIN包:
    在握手或挥手过程中,如果收到重复的ACK或FIN包,可能会导致连接双方的状态不一致,从而使连接无法正常关闭或重新建立连接。

这些异常情况都可能对TCP连接的建立和关闭过程产生影响,需要在应用程序中进行适当的处理和容错机制,以确保网络通信的可靠性和稳定性。

总结:

在TCP协议中,握手和挥手是确保可靠连接的重要过程。握手通过三次交互,确保客户端和服务器都准备好进行数据传输。而挥手通过四次交互,安全地关闭连接,保证数据完整性。然而,握手和挥手过程可能遇到异常如连接超时、洪泛攻击等。这些异常需要应用程序适当处理,保证网络通信的可靠性。理解TCP握手与挥手的原理和常见异常,有助于优化网络通信并保障数据传输的稳定性与安全性。

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

 

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

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

相关文章

Json简述(C++)

目录 1.介绍 2.格式 3.底层 3.1数据对象表示 3.2序列化接口 3.3反序列化接口 4.使用 1.介绍 Json(JavaScript Object Notation)是一种轻量级的数据交换格式,其最早是为JavaScript编程语言设计的格式。不过发发展至今,Jso…

[RoarCTF 2019Online Proxy]sql巧妙盲注

文章目录 [RoarCTF 2019Online Proxy]sql巧妙盲注解题脚本脚本解析 [RoarCTF 2019Online Proxy]sql巧妙盲注 解题 在源代码界面发现:Current Ip 我们会联想到:X-Forwarded-For来修改ip: 结果我们发现,response会讲Last Ip回显出…

基于协同过滤的电影推荐

基于协同过滤的推荐算法综述 - 知乎 (zhihu.com) # -*- coding: gbk -*- import pandas as pd_userID 1#电影评分排序 ratings pd.read_csv(ml-latest-small/ratings.csv) #打印前20行 #print(ratings.head(10))#电影所属类别 movies pd.read_csv(ml-latest-small/movies.cs…

怎么做思维导图?试试这种绘制方法

怎么做思维导图?思维导图是一种非常实用的工具,可以帮助我们更好地整理思路、总结知识和规划方案。但是传统的手绘或电脑软件绘制思维导图的方法需要一定的时间和技能,对于想要快速制作思维导图的人来说可能不太方便。下面就给大家介绍一种在…

如何测试Linux磁盘的读写速度

在Linux系统中也有很多命令可以测试硬盘的读写速度指标。以下是几个常用命令(注意:在执行测试命令之前,请务必备份数据以避免数据丢失! 1、dd 命令 首先挂载磁盘 mount /dev/sdb /testdd 命令可用于进行硬盘读写速度测试。 例…

idea在控制台中输出文字显示乱码

VM options中加入下面这行 -Dfile.encodingutf-8

leetcode27—移除元素

思路: 参考26题目双指针的思想,只不过这道题不是快慢指针。 看到示例里面数组是无序的,也就是说后面的元素也是可能跟给定 val值相等的,那么怎么处理呢。就想到了从前往后遍历,如果left对应的元素 val时&#xff0c…

每日汇评:在50日移动均线下方,黄金的下行势

1、在美国周三公布通胀数据之前,金价可能会有所回升; 2、对中国通缩的担忧可能会限制金价反弹; 3、在每日技术面看跌的背景下,黄金价格仍处于“反弹后卖出”的状态; 金价从周二创下的一个月新低1923 美元开始大幅反…

go-zero 是如何实现计数器限流的?

原文链接: 如何实现计数器限流? 上一篇文章 go-zero 是如何做路由管理的? 介绍了路由管理,这篇文章来说说限流,主要介绍计数器限流算法,具体的代码实现,我们还是来分析微服务框架 go-zero 的源…

com.alibaba.fastjson.JSONObject循环给同一对象赋值会出现“$ref“:“$[0]“现象问题

文章目录 1、问题介绍2、如何解决fastjson中$ref对象重复引用问题3、举例说明 1、问题介绍 有些场景下,我们会选择用JSONObject代替Map来处理业务逻辑,但是使用JSONObject时有一个需要注意的地方:在处理JSONObject对象时,引用的c…

SpringBoot基础之注册Servlet三大组件

文章目录 前言一、介绍二、注入Bean2.1.ServletRegistrationBean2.2.FilterRegistrationBean2.3.ServletListenerRegistrationBean 三.演示结果总结 前言 本文章将介绍SpringBoot注册Servlet的三大组件 一、介绍 由于SpringBoot默认是以jar包的方式运行嵌入式Servlet容器来启…

【LangChain学习】基于PDF文档构建问答知识库(二)创建项目

这里我们使用到 fastapi 作为项目的web框架,它是一个快速(高性能)的 web 框架,上手简单。 一.创建 FastAPI 项目 我们在IDE中,左侧选择 FastAPI ,右侧选择创建一个新的虚拟环境。 创建成功,会有…

UNIQUE VISION Programming Contest 2023 Summer(AtCoder Beginner Contest 312)D题题解

文章目录 [Count Bracket Sequences](https://atcoder.jp/contests/abc312/tasks/abc312_d)问题建模问题分析1.分析合法括号字符串的特点2.从集合角度分析字符串每个字符的作用代码 Count Bracket Sequences 问题建模 给定一个字符串,字符串内仅有3种字符&#xff…

期权定价模型系列【1】—BSM通用式模型

这是期权定价模型专栏的第一篇文章,此专栏旨在分享一些期权定价模型,将会从最基础的BSM模型开始写起,逐步扩散到蒙特卡洛模拟、二叉树等数值法模型,以及跳跃扩散模型、随机波动率模型,神经网络模型等等。 如果你觉得有…

[OnWork.Tools]系列 05-系统工具

简介 系统工具主要是将Window常用工具的快捷启动的集合 双击快速启动 计算器,记事本,截图,画图工具 控制面板,服务管理,关闭显示器,关机 启动文件夹,我的电脑,管理工具 右键菜单 添加快捷方式到桌面

外卖点餐小程序开源源码——支持扫码点餐

一套支持店内扫码点餐、外卖点餐配送于一体的餐饮系统,支持商家创建优惠券,支持商家自定义打印机功能,支持商家财务管理,支持商户菜品管理,支持菜品自定义分类,支持商家招募骑手入驻功能。系统基于thinkphp…

类与对象【下】

欢迎来到Cefler的博客😁 🕌博客主页:那个传说中的man的主页 🏠个人专栏:题目解析 🌎推荐文章:题目大解析2 目录 👉🏻初始化列表初始化列表注意点 👉&#x1f…

LinearAlgebraMIT_7_Ax=0

上节课讲了向量子空间中的列空间和零空间,这节课来讲零空间的(Special solutions)特解,也就是Ax0的特解。在求解特解的核心便是使用消元法求得(row echelon form)阶梯矩阵或者(reduced row echelon form/RREF)最简矩阵。 我们接下来举一个例子&#xff…

Android使用kotlin+协程+room数据库的简单应用

前言:一般主线程(UI线程)中是不能执行创建数据这些操作的,因为等待时间长。所以协程就是为了解决这个问题出现。 第一步:在模块级的build.gradle中引入 id com.android.application// roomid kotlin-androidid kotlin…