JavaEE: 深入探索TCP网络编程的奇妙世界(一)

文章目录

  • TCP
    • TCP协议段落格式
    • TCP相关机制
      • TCP核心机制一: 确认应答
        • 32位序号
        • 32位确认序号
        • 后发先至问题


TCP

TCP要比UDP更复杂一些~

TCP的全称为"传输控制协议".他负责对数据的传输进行一个详细的控制.

TCP协议段落格式

在这里插入图片描述

  • 源/目的端口号: 表示数据是从哪个进程来.到哪个进程去.

  • 32位序号/32位确认号: 后面再说~

  • 4位首部长度: TCP报头的长度.表示该TCP头部有多少个32bit(有多少个4字节).

    UDP协议报头固定就是8个字节.
    对于TCP来说,它的报头长度是可变长的.(后面再说)

  • 6位标志位:

    • URG: 紧急指针是否有效
    • ACK: 确认号是否有效
    • PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走
    • RST: 对方要求重新建立连接,我们把携带RST标识的称为复位报文段.
    • SYN: 请求建立连接,我们把携带SYN标识的称为同步报文段
    • FIN: 通知对方,本端要关闭了,我们称携带FIN标识的为结束报文字段
  • 16位窗口大小: 后面再说

  • 16位校验和: 发送端填充,CRC校验.接收端校验不通过,则认为数据有问题,此处的校验和不光包含TCP首部,也包含TCP数据部分.

  • 16位紧急指针: 标识哪部分数据是紧急数据.

  • 选项: 40字节头部选项,暂时忽略.

TCP相关机制

TCP最核心的机制,就是"可靠传输".

可靠传输不能做到"100%"送达,只能尽可能的使数据到达对方.

  1. 能感知到对方是否收到
  2. 如果发现对方没收到,就要进行重试.

TCP核心机制一: 确认应答

接收方收到数据之后,就要给发送方返回一个"应答报文"(ack/acknowledge)

TCP引入了序号和确认序号,来使应答报文和传输的数据能够对应上.

由于TCP是面向字节流的,此处的序号不是按照"一条两条"编号,而是按照"字节"进行编号的.
对于一个TCP数据报来说,知道了数据部分的第一个字节序号,就知道了后续所有字节的序号~
序号只是针对TCP数据报携带的载荷来进行编号的.(TCP报头不参与)

32位序号

在这里插入图片描述
32位序号,也就是4个字节,它能表示的范围是0~42亿9千万.也就是0~4GB.
这是否意味着,一个TCP数据报,最大就只能传输4GB呢?

当然不是,首先,TCP进行传输时,一次传输的基本单位不是一个TCP数据报.
不要忘了,TCP是字节流的.
一个TCP数据报,和下一个TCP数据报携带的数据,天然就是可拼接的.

比如要传输一个特别大的数据.
在传输过程中,本身就会通过多个TCP数据报来进行携带.
这些TCP数据报彼此之间携带的载荷都是可以在接收方自动被拼接起来的.

这就不像UDP那样存在传输上限~
使用UDP传输大数据,就要考虑,调用这一次send操作,参数是否超过64kb,超过64kb就不行.

使用TCP的话,就没关系,可以调用一次write,也可以调用多次write(无论怎么进行write,在网络传输和对端接收角度来看都是没差别的)

假设多次write,传输的总数据量,超过上述4GB也没关系,咱们这里的数据序号是可以从0重新设置的.

32位确认序号

在这里插入图片描述

TCP将每个字节的数据都进行了编号,即为序列号.

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

对于应答报文来说,确认序号就会按照收到的数据的最后一个字节的序号+1的方式来填写.

另外,六个标志位中,第二位(ACK),会设为1.

  • 对于普通报文,ack是0
  • 对于应答报文,ack是1

在这里插入图片描述

  • 如果是普通报文,序号是有效的,确认序号是无效的.

  • 如果是ack应答报文,序号和确认序号都是有效的.

    这是另一套编号的体系,和传输数据的序号不是同一套的.

后发先至问题

什么是后发先至?
举个例子,我跟朋友发短信.
在这里插入图片描述

虽然朋友先发的"好啊",后发的"不行,有事",但是网络传输过程中,可能存在"后发先至".
对于我接收方来说,可能先收到"不行,有事"后收到"好啊".
此时歧义就出现了,我认为朋友有事,不能开黑,但是明天可以去北京.而朋友认为能开黑,但是明天有事,不能去北京.

后发先至是客观的情况,无法改变.

为了解决上述问题,TCP就针对接收方收到的数据,进行了重新排序.确保应用程序读取到的数据一定是和发送方的数据顺序是一致的!

更具体一点: A为发送方,B为接收方.
在这里插入图片描述
B接收方这边调用read的时候如果没有数据,就会阻塞等待.
当1001-2000这个数据先到了B时,B不会让read解除阻塞.
直到1-1000这个数据到达之后,read才会解除阻塞,才会读取到1-1000,1001-2000数据.
这样就确保了发送方write顺序和接收方read的顺序始终是保持一致的.

B接收方这边的操作系统内核里,会有一段内存空间,作为"接收缓冲区".
收到的数据,就会先在接收缓冲区中排队等待,直到开头的数据到了,应用程序才能真正读取到里面的数据~

这个过程就跟接亲差不多.
后面的车先到了女方村口,并不能直接开到新娘家门口去接人.
这样的车得在村口等待,必须等头车到了,以及后面的车陆续都差不多,重新排好队,再慢慢开到新娘家门口~

下一篇文章:JavaEE: 深入探索TCP网络编程的奇妙世界(二)

本文到这里就结束啦~
在这里插入图片描述

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

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

相关文章

Python 如何处理大文件的读取

Python 如何处理大文件的读取 在日常的开发工作中,我们经常会遇到处理大文件的需求。无论是读取日志文件、处理数据集,还是分析超大文本文件,大文件操作都是一个非常常见的挑战。尤其是在内存有限的环境中,直接将整个文件加载到内…

Docker配置代理解决pull超时问题

操作系统: CentOS Linux 8 Docker版本: 26.1.3 前置:你需拥有🐱 1. 配置 proxy.conf 1.1 创建配置文件目录 创建 docker.service.d,进入到 docker.service.d 中打开 proxy.conf (没有文件打开会自动创建)。 注意:每个人的路径可…

深度学习|误差逆传播:梯度速解

文章目录 引言链式法则误差逆传播加法的逆传播乘法的逆传播逆传播求梯度 SoftmaxWithLoss 层正向传播逆传播代码实现参考 结语 引言 我们知道训练神经网络模型的核心是以损失函数为基准来调整优化网络参数,使得网络的输出尽可能接近真实标签。在神经网络中&#xf…

Vue使用qrcodejs2-fix生成网页二维码

安装qrcodejs2-fix npm install qrcodejs2-fix核心代码 在指定父view中生成一个二维码通过id找到父布局 //通过id找到父布局let codeView document.getElementById("qrcode")new QRCode(codeView, {text: "测试",width: 128,height: 128,colorDark: #00…

Fyne ( go跨平台GUI )中文文档-小部件 (五)

本文档注意参考官网(developer.fyne.io/) 编写, 只保留基本用法 go代码展示为Go 1.16 及更高版本, ide为goland2021.2 这是一个系列文章: Fyne ( go跨平台GUI )中文文档-入门(一)-CSDN博客 Fyne ( go跨平台GUI )中文文档-Fyne总览(二)-CSDN博客 Fyne ( go跨平台GUI…

LeetcodeTop100 刷题总结(二)

LeetCode 热题 100:https://leetcode.cn/studyplan/top-100-liked/ 文章目录 八、二叉树94. 二叉树的中序遍历(递归与非递归)补充:144. 二叉树的前序遍历(递归与非递归)补充:145. 二叉树的后序遍…

移动数组中数字的方法(c语言)

1.移动一维数组中的内容;若数组中有n个整数,要求把下标从0到p(含p,p小于等于n-1)的数组元素平移到数组的最后。 例如,一维数组中的原始内容为:1,2,3,4,5,6,7,8,9,10;p的值为3。 移动后,一维数组中的内容应为:5,6,7,8…

qm 命令:管理PVE虚拟机

一、命令简介 ​qm​ 是 Proxmox Virtual Environment (PVE) 中用于管理虚拟机的命令行工具。它允许用户创建、启动、停止、删除虚拟机,以及管理虚拟机的配置和状态。 ‍ 介绍 PVE Proxmox Virtual Environment (PVE) 是一个开源的虚拟化管理平台,专…

设计模式 享元模式(Flyweight Pattern)

享元模式 简绍 享元模式(Flyweight Pattern)是一种结构型设计模式,它的目的是通过共享技术来有效地支持大量细粒度的对象。享元模式可以极大地减少内存的使用,从而提高程序的性能。它特别适用于需要创建大量相似对象的场景&#…

QT 数据加密

一.使用环境 应该是通用的,此测试版本为如图 二.使用代码 1. 运行代码 QString data = "123abcAbc.-+";qDebug() << "加密:" << QAESEncryption::encodedText(data, "填入自己秘钥");qDebug() << "解密:" <…

C++STL的Stack的使用:STL栈和队列的使用介绍、leecode---最小栈、nowcoder---栈的压入、弹出序列等的介绍

文章目录 前言一、STL栈和队列的使用二、leetcode---最小栈三、nowcoder---栈的压入、弹出序列四、逆波兰表达式求值总结 前言 CSTL的Stack的使用&#xff1a;STL栈和队列的使用介绍、leecode—最小栈、nowcoder—栈的压入、弹出序列等的介绍 一、STL栈和队列的使用 #include …

服务器安装pytorch_geometric torch_scatter踩坑记录

conda create -n pyg python3.8.12 pip install torch1.13.0安装的版本如下 pip install torch-scatter pip install torch-sparse pip install torch-cluster pip install torch-spline-conv pip install torch-geometric2.2.0 pip install ipykernel python -m ipykernel i…

Adobe Illustrator吸管工具提取的颜色与原色之间存在色差

问题原因&#xff1a; 被提取颜色的对象是外部链接图片&#xff0c;对其提取的颜色会与AI中看到的颜色不同 如下图所示&#xff0c;中间的矩形与外部矩形的内部颜色存在色差 解决办法&#xff1a; 方法一&#xff1a;将该外部图片利用屏幕截图的形式&#xff0c;粘贴到AI中。…

2.以太网

局域网 局域网: Local Area Networks (LAN) 网络大小分类 局域网园区网(可以理解为企业网)城域网 广域网是一个网络连接的技术&#xff0c;并非多大范围的网络 网关 为局域网内的用户提供了一扇门&#xff0c;通过网关可以访问到别的网络。这个门&#xff0c;就叫网关 以…

部标(JT/T1078)流媒体对接说明

1.前言 最近在配合客户开发流媒体相关的服务的时候&#xff0c;整理了一些对接过程资料&#xff0c;这里做个分享与记录。流媒体的对接主要牵扯到4个方面&#xff1a; &#xff08;1&#xff09;平台端&#xff1a;业务端系统&#xff0c;包含前端呈现界面。 &#xff08;2&a…

物联网实践教程:微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制 远程上报和接收数据——STM32代码实现篇

STM32代码实现 开启本章节需要完成下方的前置任务&#xff1a; 点击跳转&#xff1a; 物联网实践教程&#xff1a;微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制 远程上报和接收数据——汇总 目标 1.连接OneNET&#xff1a;STM32使用串口与ESP8266/01s连接发送…

Linux网络命令:用于请求和配置网络地址的命令dhclient详解

目录 一、概述 二、功能描述 三、基本使用 1. 命令格式 2. 常用选项 3. 获取帮助 ​编辑 4. 基本操作 四、工作原理 1. 发送DHCP请求 2. 接收DHCP响应 3. 请求IP地址 4. 确认IP地址 5. 配置网络接口 五、功能特点 六、配置文件 七、常用命令和示例 1、启动…

QT客户端发送HTTP请求此时服务器到底收到了哪些数据?

一个Http请求包括 请求行 请求头 空行 请求体 下面是示例&#xff1a; 1,2,3,4分别代表上面的四个部分&#xff0c;我只是做了一些解析&#xff0c;具体可以结合代码 1. post / HTTP/1.1 2.GET请求头包括Host(主机名),user-agent&#xff08;客户端标识符&#xff09;&am…

SiMBA:基于FFT变换和Mamba的图像分类模型算法解析

目录 1 算法原理1 EinFFT&#xff1a;1.1 频谱变换1.2 频域通道混频 & 频谱门控网络1.3 逆频谱变换 2 整体计算公式3 SiMBA&#xff1a;4 小结 2 代码大致逻辑EinFFT模块MambaBlock模块MambaLayer模块PVT2FFN和FFN模块ClassBlock和Block_mamba模块DownSamples模块Stem模块定…

统信服务器操作系统【targetcli部署】

targetcli部署方案 文章目录 功能概述功能介绍1.安装targetcli2.targetcli语法及参数说明3.示例1. 配置2.访问功能概述 SCSI 即小型计算机系统接口(Small Computer System Interface;简写:SCSI) iSCSI,internet SCSI 网络磁盘 ,提供一对一的网络存储, 主机A 提供xx存储设…