当前位置: 首页 > news >正文

UDP/TCP协议解析

在这里插入图片描述

  • 我最近开了几个专栏,诚信互三!
    ====> |||《算法专栏》::刷题教程来自网站《代码随想录》。|||
    ====> |||《C++专栏》::记录我学习C++的经历,看完你一定会有收获。|||
    ====> |||《Linux专栏》::记录我学习Linux的经历,看完你一定会有收获。|||
    ====> |||《C#专栏》::记录我复习C#的经历,深度理解查漏补缺,不定期更新。|||
    ====> |||《计算机网络专栏》::记录我学习计算机网络,看完你一定会有收获。|||

UDP/TCP协议解析

  • UDP报文格式
  • UDP面向数据报解析
  • TCP报文格式及字段解析
  • TCP面向字节流解析
  • TCP三次握手/四次挥手解析
    • TCP为什么需要三次握手
    • TCP为什么要四次挥手
    • 三次握手和四次挥手特点

UDP报文格式

UDP报文格式如下。
在这里插入图片描述
UDP首部字段有八个字节。

{ src port : dest port : len : 校验和}

1).其中len字段代表整个报文长度,16个比特位代的范围[0 — 65,535]字节,大约为64K。
报头的长度就是保证UDP是面向数据报的原理,从缓冲区中读取数据,都可以通过头部字段的len进行一些计算,让每次从缓冲区中读出的都是UDP的整个数据报。

UDP面向数据报解析

面向数据报,及通过缓冲区读入的内容是以整个数据报为单位进行读取的。
报头的长度就是保证UDP是面向数据报的原理,从缓冲区中读取数据,都可以通过头部字段的len进行一些计算,让每次从缓冲区中读出的都是UDP的整个数据报。

TCP报文格式及字段解析

TCP报文格式如下。
在这里插入图片描述
1).对于源端口和目的端口,没有可讲解的。
2).序号:在TCP连接刚建立的时候,OS会随机生成一个序号,序号 = 确认序号 + len(数据长度) - 1,(序号只有在存在数据时,或者在三次握手以及四次挥手的SYN段,RST段,FIN段时才有意义)。
3).确认号:确认号代表在该号之前的所以数据都以及收到,确认号 = 收到的序号 + 1
4).数据偏移:该字段只有4位,范围为[0,15],其代表了整个报头的大小,但是该大小只是一个数字,确定的大小需要在该大小上 * 4。
5).6个标志位:URG=紧急指针,ACK=确认位,PSH=快速交付位,RST=重新设置,SYN=同步位,FIN=终止位,这六种比特位,会在以下介绍。
6).窗口:该字段是用来进行流量控制的主要字段,其表示的是接收窗口剩余字节数量。
7).校验和:用于校验整个TCP数据报是否有错误。
8).紧急指针:紧急指针用于指向TCP数据字段中的某个位置,该紧急指针的长度为一个字节,让该位置的字节会被上层优先获得,从而判断接下来该怎么办。

TCP面向字节流解析

面向字节流,及在传输过程中,报文和报文之间没有明显的分割,对于发送端来说,发送的数据是一个一个字节,对于接收方来说,接收的也是一个一个字节,所以接收方通过接口接收到的数据可能并非是一个完整的报文。

TCP三次握手/四次挥手解析

TCP建立链接是通过三次握手来实现的,TCP三次握手示意图如下。
在这里插入图片描述

1).首先,服务端调用Listen接口,服务器阻塞在Listen接口处,进入LISTEN状态,等待客户端建立链接。
2).其次,先生成随机确认号,同时客户端调用connect接口发送SYN报文,此时客户端进入SYN_SENT状态。
3).在服务端接收到SYN报文,同时服务端发送SYN | ACK报文,此时服务端处于SYN_RECV状态。
4).随后客户端发送ACK报文,此时客户端的链接以及建立成功。
5).最后,在服务端收到ACK报文后,此时服务端的链接建立成功。


TCP四次挥手示意图如下。
在这里插入图片描述
1).首先,由主动关闭通信的一端发送FIN报文,同时进入FIN_WAIT-1状态。
2).其次,在被动关闭端收到FIN报文后,进入CLOSE_WAIT状态,在CLOSE_WAIT状态中,被动关闭端会将缓冲区的所有数据都发送到网络中
3).再次,缓冲区的数据发送到网络中后,被动关闭端会发送FIN | ACK报文,同时被动关闭端进入LAST_ACK端。
4).主动关闭端收到FIN | ACK报文后,主动关闭端发送ACK报文,主动关闭端进入TIME_WAIT状态,该状态需要两个MSL时间。

2MSL时间中,是为了让主动关闭端等待CLOSE_WAIT状态中发送的报文到达主动关闭端。

同时关闭socket。
5).被动关闭端在接收到ACK报文后,被动关闭端关闭socket。

TCP为什么需要三次握手

TCP是面向链接的传输,同时TCP是全双工通信,所谓的面向链接,并不是真正的建立链接,该链接只是抽象的链接,同时需要帮助TCP的全双工通信这就要求服务端能收到客户端的报文,同时客户端能收到服务端的报文,而当客户端收到SYN | ACK报文后,客户端的链接就已经建立完毕,当服务端收到ACK后,服务端的链接就已经建立完毕,就已经保证了面向链接以及全双工这两种特点。

TCP为什么要四次挥手

由于TCP是面向链接全双工的,四次挥手的目的是为了关闭双方的通信链接(抽象链接),所以,主动关闭方发送FIN报文,被动关闭方发送ACK报文,关闭一条链接,随后被动关闭方发送FIN | ACK报文,同时主动关闭方发送ACK报文,关闭一条链接,自此两条链接被关闭。

三次握手和四次挥手特点

如图。
在这里插入图片描述
在这里插入图片描述
在TCP中,存在一种叫做捎带应答的机制,及需要发送ACK报文只需要将报头的ACK位制为1即可,但是TCP的数据部分却没有被设置,所以我们将多种状态信息或数据信息都装载在同一个TCP报文中发送出去就是捎带应答
所谓的三次握手,实际上就是将ACK报文SYN报文这两种状态信息都放在一个TCP报文中,捎带应答了。
在这里插入图片描述
实际上可以将SYN和ACK分开,分开后,所谓的三次握手本质就是四次握手了。
在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Windows 下的sqlserver数据拷贝到linux
  • Cadence23学习笔记(十四)
  • 深入浅出C语言指针(进阶篇)
  • 自动化测试--WebDriver API
  • element表单disabled功能失效问题
  • eqmx上读取数据处理以后添加到数据库中
  • 华为Ascend C算子开发(中级)考试
  • web网站组成
  • 《华为数据之道》读书笔记六---面向自助消费的数据服务建设
  • powershell自定义命令别名
  • pglogical扩展的基本用法介绍
  • leetcode日记(51)不同路径Ⅱ
  • 数据治理之“财务一张表”
  • python-爬虫实例(1):获取京东商品评论
  • linux-conda环境安装配置教程
  • [Vue CLI 3] 配置解析之 css.extract
  • 2017-08-04 前端日报
  • Android组件 - 收藏集 - 掘金
  • co模块的前端实现
  • mysql常用命令汇总
  • Redis 懒删除(lazy free)简史
  • STAR法则
  • vue自定义指令实现v-tap插件
  • Web设计流程优化:网页效果图设计新思路
  • 分享几个不错的工具
  • 看域名解析域名安全对SEO的影响
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 七牛云假注销小指南
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 在Mac OS X上安装 Ruby运行环境
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​LeetCode解法汇总518. 零钱兑换 II
  • # 透过事物看本质的能力怎么培养?
  • #微信小程序:微信小程序常见的配置传旨
  • (1)STL算法之遍历容器
  • (2)nginx 安装、启停
  • (javaweb)Http协议
  • (leetcode学习)236. 二叉树的最近公共祖先
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (二)换源+apt-get基础配置+搜狗拼音
  • (六)c52学习之旅-独立按键
  • (转)我也是一只IT小小鸟
  • .mp4格式的视频为何不能通过video标签在chrome浏览器中播放?
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .Net6 Api Swagger配置
  • .net与java建立WebService再互相调用
  • .NET中 MVC 工厂模式浅析
  • .sdf和.msp文件读取
  • /dev下添加设备节点的方法步骤(通过device_create)