计算机网络---传输层(tcp协议,三次握手,四次挥手)

2023-05-16

  • tcp报头
  • 三次握手四次挥手
  • 状态改变
  • WIME_WAIT状态
  • 相关的问题
    tcp协议是面向连接,可靠传输,面向字节流的传输层协议,
    首先我们认识一下tcp的协议报头
    在这里插入图片描述
  • 源/目的端口:表示数据是从哪个进程来,到哪个进程去,标志我们的数据发送的进程
  • 32序号和确认序号:这是保证了数据的可靠传输的(后面详细讲解)
  • 4位TCP报头长度:表示该TCP头部有多少个32位bit(有多少4字节),所以TCP头部最大长度是15*4-60字节
  • 6位标志位
    (1)URG:紧急指针是否有效
    (2)ACK:确认号是否有效
    (3)PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走
    (4)RST:对象要求重新建立连接,我们把携带RST标识的称为复位报文段
    (5)SYN:请求建立连接,我们把携带SYN标识的称为同步报文段
    (6)FIN:通知对方,本端要关闭了,我们称携带FIN标识的位结束报文段
  • 16位窗口大小:在滑动窗口机制中使用,在后面解释
  • 16位校验和:发送端填充,CRC校验,接收端校验不通过的时候数据出错,检验和包括了数据和头部
  • 16位紧急指针:标识那部分数据是紧急数据
  • 40字节头部选项

TCP是面向连接的,那怎样去实现我们的面向连接呢,这时候就是三次握手建立连接以及四次挥手关闭连接。如下图

在这里插入图片描述
三次握手过程:首先发起连接请求的是客户端,给服务器端发送一个SYN请求,并且可以携带一定的数据,也可以不用携带,在我们的服务端收到一个SYN请求的时候会给客户端回复一个ACK+SYNACK作用就是服务端确定收到了这么一个请求,SYN是和客户端建立一个连接请求,在客户端收到请求之后会发送一个ACK请求,这里我们就三次握手即完成了。
服务端状态改变:服务端在从CLOSED状态到我们的SYN_RCVD就是我们创建套接字,绑定我们的ip信息,设置监听,在设置监听之后服务端才能对SYN请求包进行接收,在接收到一个SYN请求之后服务端状态就变为了SYN_RCVD状态。就表示我们已经接收到了客户端发来的请求。在发送SYN+ACK之后客户端回复之后服务端就变为ESTABLISHED状态。
客户端状态接收
客户端从CLOSED状态变为SYN_SENT状态就是我们建立一个套接字,并且进行connect()之后就变为SYN_SEND状态,,在发送SYN之后收到服务端回复之后就变为ESTABLISHED状态。
只有客户端和服务端都处于ESTABLISHED状态的时候才能进行数据通信

数据通信:就是进行sendrecv操作,在上图中是客户端发送数据,服务端需要回复一个ACK,表示这已经成功接收到了数据

四次挥手
这和三次握手不一样,三次握手是客户端发起的SYN请求,在四次挥手中客户端和服务端都能发起断开连接请求。比如上图中。首先客户端给服务端发起一个FIN包,表示我要和你断开连接,在服务端收到FIN包的时候回复一个ACK表示我已经收到了你的请求,并且给客户端也发送一个FIN包,表示我也要和你断开连接,客户端收到FIN后回复给服务端一个ACK,当服务端收到之后连接就此断开。
客户端状态变化
当客户端发起FIN就是我们close()产生的。当调用close()之后客户端变为FIN_WAIT1状态在发送FIN包之后服务端收到之后并且发起一个ASK应答,在客户端收到之后变为FIN_WAIT2状态,到服务端也发起一个FIN请求,在客户端收到之后就变为TIME_WAIT状态,当服务端CLOSE之后客户端也进入CLOSED状态。
服务端状态变化
当接收到客户端发出的FIN请求的之后服务端变为CLOSE_WAIT状态,在回复ACK应答之后给客户端发起一个FIN之后变为LAST_ACK,知道最后变为CLOSED状态

状态变化图

特殊状态
在三次回收四次握手中有两个特殊的状态,一个是ESTABLISHED和TIME_WAIT状态,并且是必不可少的。

  • ESTABLISHED:是建立三次握手之后的客户端和服务端的状态,只有两边同时处于ESTABLISHED状态才能进行数据通信
  • TIME_WAIT(主动关闭方才有
    (1)如果没有TIME_WAIT状态的话在四次挥手中加入客户端发送的ACK丢失的话服务端不能关闭,但是客户端已经关闭了,当收不到ACK的时候服务端会重新发送一个FIN包请求,这时候客户端已经关闭,假如一个新的客户端建立之后使用先前的端口信息,会直接将FIN包发送给新的客户端,这回对新的连接造成影响
    (2)若新客户端使用相同端口信息,向服务端发送FIN请求,但是服务端因为没有收到最后一个ACK请求处于LAST_ACK状态,在收到SYN后判定状态错误,回复RST报文重置连接,也对新的连接造成影响。
    (3)TIME_WAIT一般持续时间是2MSL(报文最长生命周期)因为在ACK丢失的时候,导致对方重传的时候需要2*MSK,也是等待网络中所有双方延迟的报文消失在网络中,不会对后序的操作造成影响。

相关问题
(1)为什么握手是三次,挥手是四次呢?
握手是三次是确保可靠的基本需要,因为2次是不能建立连接的,但是四次又太多余了,ACK和SYN是可以一起发送的。就像我们打电话一样,接通之后需要确定双方都能听到对方的声音。
挥手是四次:当被动方收到主动方报文通知时,他仅仅表示主动方没有数据在发送给被动方了,但是未必被动方所有的数据都完整的发送给了主动方,所以被动方不会马上关闭SOCKET,他可能还需要发送给主动方一些数据再发送FIN报文给主动方,告诉主动方统一关闭连接。所以这里的FIN和ACK是分开发送的。
(2)若三次握手第三次握手失败,服务端如何去处理?
第三次握手失败之后并不会重传ACK报文,而是直接发送RTS报文段,进入CLOSED状态,这样的目的就是为了防止SYN泛洪攻击
(3)SYN泛洪攻击是什么,怎样去预防?
SYN泛洪攻击就是利用TCP三次握手机制,攻击端利用伪造的IP地址向被攻击端发出请求,而被供给端发出的响应报文将永远发送不到目的地,那么背攻击端在等待关闭这个连接的过程中消耗了资源,当连接成千上万的时候主机资源被消耗完,服务端就瘫痪了。
预防

  • 增加TCP backlog队列
    由于其基本原理是依赖于终端主机连接套接字的backlog溢出,因此一个显然的基于终端主机的解决方案是增加backlog队列的大小。通过修改listen()函数的参数和一个操作系统内核参数SOMAXCONN
  • 减少SYN_RECEIVED的时间
    缩短一个TCP从进入SYN_RCVD状态到因未进入下一个状态而被回收的事件,
    等等…

(4)TIME_WAIT的作用(在上面已经讲解过了)
(5)若服务端出现了大量的TIME_WAIT状态,为什么?如何解决?
只有在主动关闭方才会出现TIME_WAIT状态,一般来说都是客户端主动关闭,服务端不会出现TIME_WAIT状态,但是有一些特殊的服务,比如pop/smtp,ftp却是服务端收到客户端的QUIT命令之后主动关闭连接,这就造成服务端出现大量的TIME_WAIT状态,
解决办法:让服务器能够快速回收和重用那些TIME_WAIT的资源,修改参数,设置端口复用。将TIME_WAIT的时间设置小点。就可以减少TIME_WAIT的状态数量

(6)服务端保持大量的CLOSE_WAIT状态,为什么?如何解决?
出现原因:对方在关闭连接之后服务器程序自己没有进一步发出ACK信号,换句话说就是在对方连接关闭之后程序里没有检测到,或者程序压根就忘记这个时候需要关闭连接,所以这个资源一直被程序占用。(对方连接的异常或者自己没有迅速的回收资源)
解决办法:查看代码,这是代码中出现的错误。比如没有关闭套接字等等。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算机网络---传输层(tcp协议,三次握手,四次挥手) 的相关文章

  • 四旋翼无人机学习之准备篇(一)

    最近我哥要给我邮递个四旋翼无人机 xff0c 再加上本人对蓝天从小就很感兴趣 所以在学习完四驱小车后打算上手下无人机 刚开始学习根本不知道要看哪些 xff0c 在几天漫无头绪的学习 xff0c 终于有点气色了 xff0c 就把学习经验分享给
  • 更改Ubuntu默认python版本的方法

    可以按照以下方法使用 ls 命令来查看你的系统中都有那些 Python 的二进制文件可供使用 1 2 ls usr bin python usr bin python usr bin python2 usr bin python2 7 us
  • c++求素数

    C 43 43 练习第一课 C 43 43 输入一个n 求n以内的素数 xff1a C 43 43 输入一个n 求n以内的素数 xff1a include span class token operator lt span iostream
  • 贪吃蛇

    C尝试写的贪吃蛇项目 xff08 数组实现 xff09 以后会更新用链表实现贪吃蛇 span class token macro property span class token directive keyword define span
  • Android公司面试题

    Android 面试题及面试经验 我的第一次面试经验 今天来到成都面试 xff0c 面试的是Android xff0c 说实话 xff0c Android并不是我的强项 xff0c 只是在大学期间接触过 第一关人事还可以 xff0c 第二关
  • linux---tcp通信流程以及代码实现

    TCP通信特性 xff1a xff08 在网络版块详细讲解 xff09 面向连接 可靠 面向字节流 TCP通信过程 c 43 43 封装TCP通信 1 include lt iostream gt 2 include lt arpa ine
  • 物联网学习及理解

    物联网学习及理解 xff08 来自一个物联网专业学生的心得 xff09 什么是物联网物联网能做什么一 物联网运用领域二 物联网发展趋势 物联网怎么实现一 局域网内的物联网二 广域网内的物联网 总结 在开始写这篇博客之前 xff0c 我不得不
  • vscode代码格式化快捷键

    Windows xff1a Shift 43 Alt 43 F Linux Ctrl 43 Shift 43 I MacOS Shift 43 Option 43 F
  • 多线程和网络编程(多线程)

    一 多线程 1 进程和线程 进程 xff1a 是正在运行的程序 是系统进行资源分配和调用的独立单位 每一个进程都有它自己的内存空间和系统资源 线程 xff1a 是进程中的单个顺序控制流 xff0c 是一条执行路径 单线程 xff1a 一个进
  • Java八种基本数据类型(图文详解)

    Java八种基本数据类型 Java八种数据类型Java八种数据类型的分类 xff08 图 xff09 基本数据类型分为三大类 数值型 字符型 布尔型 数值型整数类型 xff08 byte short int long xff09 浮点型 f
  • numpy基础用法-学习笔记-task10

    大作业 本次练习使用 鸢尾属植物数据集 iris data xff0c 在这个数据集中 xff0c 包括了三类不同的鸢尾属植物 xff1a Iris Setosa xff0c Iris Versicolour xff0c Iris Virg
  • STM32F103驱动LD3320语音识别模块

    STM32F103驱动LD3320语音识别模块 LD3320语音识别模块简介模块引脚定义STM32F103ZET6开发板与模块接线测试代码实验结果 LD3320语音识别模块简介 基于 LD3320 xff0c 可以在任何的电子产品中 xff
  • Arduino UNO驱动土壤湿度传感器检测

    Arduino UNO驱动土壤湿度传感器检测 简介运行要求Arduino UNO与传感器接线程序展示实践效果总结 简介 本次使用到是这个新款土壤湿度传感器 xff01 这款电容式土壤湿度传感器区别于市面上绝大部分的电阻式传感器 xff0c
  • ESP32使用TCP HTTP访问API接口JSON解析获取数据

    ESP32使用TCP HTTP访问API接口JSON解析获取数据 API接口代码解析获取时间代码烧录效果总结 API接口 单片机常用的API接口基本都是返回的一串JSON格式的数据 xff0c 这里以ESP32联网获取时间信息作为获取API
  • 电池保护板 - 问题归纳

    电池保护板 问题归纳 简介充电锂电池磷酸铁锂电池 放电总结 最近更新日期 xff1a 2023 03 07 简介 电池充放电过程中 xff0c 如果电压 电流或温度等参数不稳定或超出电池的安全范围 xff0c 就会对电池造成损害 xff0c
  • Arduino驱动DS1302显示时钟

    Arduino驱动DS1302显示时钟 前言电气参数经典应用电路接线程序实验结果 前言 目前有许多流行的串行时钟电路 xff0c 例如 DS1302 xff0c DS3231 xff0c DS1307 xff0c PCF8485 等 它们由
  • 计算机网络---应用层以及HTTP协议

    网络层是程序员接触最多的一个层级 xff0c 应用层是层级体系中的最上层的一级 xff0c 是我们做逻辑处理最多的 应用层的功能什么是urlhttp协议 应用层的功能 是程序员写的一个一个解决的实际的问题都是在应用层 xff0c 是做逻辑运
  • 51驱动NRF24L01通信,NRF24L01与TTL转NRF24L01模块通信

    51驱动NRF24L01通信 xff0c NRF24L01与TTL转NRF24L01模块通信 NRF24L01一 简介二 引脚功能描述 程序设计一 对 24L01 的程序编程的基本思路如下 xff1a 二 Tx 与 Rx 的配置过程1 Tx
  • 51单片机驱动K型热电偶 OLED0.96显示

    51单片机驱动K型热电偶 OLED0 96显示 一 基本参数二 接线三 部分代码引脚定义时序对用代码 四 实验现象五 注意事项 一 基本参数 二 接线 K型热电偶 MAX6675 模块引脚说明GNDGND接地 单独供电需要与MCU共地VCC
  • 基于ESP32做低功耗墨水屏时钟

    基于ESP32做低功耗墨水屏时钟 电子墨水屏概述 ESP32实验低功耗电子时钟功能描述接线开发实验结果 电子墨水屏 概述 电子墨水是一种革新信息显示的新方法和技术 和传统纸差异是电子墨水在通电时改变颜色 xff0c 并且可以显示变化的图象

随机推荐

  • STC89C52制作可程控低频信号发生器

    STC89C52制作可程控低频信号发生器 准备工作操作流程关于PCF8591实现构思 相关代码定时器相关代码串口控制频率和LCD显示函数 相关功能现象总结 准备工作 由于51单片机本身并不自带DAC的功能 xff0c 因此需要借助外置模块实
  • Arduino UNO驱动 Si3531A三通道时钟信号发生器

    Arduino UNO驱动 Si3531A三通道时钟信号发生器 Si3531A模块简介模块引脚定义Arduino UNO与模块接线测试代码实验结果 Si3531A模块简介 Si3531A是一个IIC接口可编程时钟信号频率发生器 xff0c
  • Arduino驱动HC-SR04超声波测距

    Arduino驱动HC SR04超声波测距 前言电气参数基本工作原理时序图接线程序实验结果总结 前言 HC SR04超声波测距模块可提供2cm 400cm的非接触式距离感测功能 xff0c 测距精度可达3mm xff0c 包括发射器 接收器
  • stm32f103c8t6新建环境+点灯

    stm32f103c8t6新建环境 43 点灯 简介步骤一 新建文件二 建立启动 43 用户端本身文件三 mdk内部设置四 实现基础工作效果五 点灯 总结 简介 STM32F103C8T6是一款由意法半导体公司 xff08 ST xff09
  • ESP32驱动1.28寸GC9A01播放视频(一、视频分辨率的调整和视频格式的转换)

    ESP32驱动1 28寸GC9A01播放视频 xff08 一 视频分辨率的调整和视频格式的转换 xff09 播放前准备转换视频分辨率用FFmpeg将 MP4转换为 mjpeg格式FFmpeg的win10环境搭建FFmpeg的下载环境变量的搭
  • Arduino UNO驱动micro SD卡读写模块

    目录 一 简介二 使用前准备三 测试方法四 实验现象 一 简介 Micro SD卡模块TF卡读写卡器板载电平转换电路 xff0c 即接口电平可为5V或3 3V xff0c 支持支持Micro SD卡 2G Micro SDHC高速卡 32G
  • ESP32驱动1.28寸GC9A01播放视频(二、程序说明和效果展示)

    ESP32驱动1 28寸GC9A01播放视频 xff08 二 程序下载和效果展示 xff09 1 28寸GC9A01屏幕屏幕引脚定义 程序说明程序更改1 Arduino DataBus bus和Arduino GC9A01 gfx要改成ES
  • 计算机网络---传输层的udp协议

    首先我们认识要在应用层对数据封装之后需要传输到传输层进行封装 xff0c 但是在应用层只是对数据进行了处理 xff0c 所以在传输层上需要对传输到那个进程进行设置 xff0c 所以在传输层需要对port进行设置 所以port是标志一个进程
  • c++中 ->,c++中::

    gt gt 用于指针 gt 用于指向结构体的指针 gt 用于指向结构体的指针 xff0c 表示结构体内的元素 include lt stdio h gt struct role 定义一个结构体 char name 8 姓名 int leve
  • U8W/U8W-Mini使用与常见问题解决

    U8W U8W Mini使用与常见问题解决 U8WU8W U8W mini简介准备工作U8W U8W mini在线联机下载U8W U8W mini脱机下载第一步 xff0c 把程序下载到U8W U8W mini烧录器中 xff1a 第二步
  • Arduino 驱动GP2Y1014AU检测PM2.5

    Arduino 驱动GP2Y1014AU检测PM2 5 一 基本参数二 接线三 部分代码引脚定义对应代码 四 实验现象五 注意事项 一 基本参数 二 接线 三 部分代码 引脚定义 define measurePin span class t
  • STM32F103ZET6驱动TOF250激光测距传感器

    STM32驱动TOF250激光测距传感器 TOF250介绍I2C通讯协议I2C寄存器地址 TOF250引脚说明和STM32的接线和STM32的接线 程序实验结果总结 TOF250介绍 TOF250是一款基于TOF原理的单点测距雷达 xff0
  • STM32驱动SG90舵机

    STM32驱动SG90舵机 关于SG90舵机SG90转动角度与占空比的关系驱动SG90舵机代码 确定控制引脚 写代码 SG90舵机正常驱动现象总结 关于SG90舵机 SG90是一种小型伺服电机 xff0c 通常用于模型制作和小型机械应用中
  • Arduino驱动L298N控制直流电机的正反转和调速

    Arduino驱动L298N控制直流电机的正反转和调速 一 前言二 产品参数三 驱动直流电机三 接线图四 程序五 实验结果总结 一 前言 本模块使用ST公司的L298N作为主驱动芯片 xff0c 具有驱动能力强 xff0c 发热量低 xff
  • Livox MID-70连接及使用

    ROS下载安装 本文选用ros xff0c 未使用ros2 在Ubuntu18 04下配置ros 下载安装参考 xff1a Ubuntu18 04安装 ROS桌面完整版 其中注意在第8部分 span class token function
  • 微信小程序 宠物论坛1

    微信小程序宠物论坛1 一个简单的论坛包括以下几个方面 xff1a 登录模块发帖模块首页模块帖子详情模块搜索模块个人主页模块 下面将从这6个方面介绍如何用微信小程序开发一个简单的论坛 登录模块 先看界面图 打开小程序首先看到这个界面 xff0
  • 微信小程序宠物论坛6

    微信小程序宠物论坛6 个人主页页面 JS部分 const db 61 wx cloud database Page data openid 34 34 nickname 34 34 heads 34 34 onLoad function o
  • 激光SLAM从理论到实践学习——第三节(传感器数据处理2:激光雷达运动畸变的去除)

    传感器数据处理2 xff1a 激光雷达运动畸变的去除 激光雷达运动畸变的去除比里程计标定更重要 xff0c 但也取决于用的雷达型号 我用的思岚A2雷达频率小于10Hz xff0c 畸变也是比较明显的 概念介绍 激光雷达传感器介绍 xff08
  • Ubuntu16.04 ROS环境中RealSense D435i安装使用

    Ubuntu16 04 ROS环境中RealSense D435i安装使用 弄了三四天 xff0c 网上说法很多 xff0c 有的说需要编译内核 xff0c 然而编译内核下载的补丁特别慢 xff0c 有的说catkin make的需要加其它
  • 计算机网络---传输层(tcp协议,三次握手,四次挥手)

    tcp报头三次握手四次挥手状态改变WIME WAIT状态相关的问题 tcp协议是面向连接 xff0c 可靠传输 xff0c 面向字节流的传输层协议 xff0c 首先我们认识一下tcp的协议报头 源 目的端口 xff1a 表示数据是从哪个进程