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

news2024/9/21 15:02:17

文章目录

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

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

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

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

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

相关文章

Innodb内存结构

缓冲池Buffer Pool: 缓冲池是innodb内存结构缓冲区中的核心部分,在服务启动的时候服务器会向操作系统申请一块大小为128MB的内存空间,所有对数据库中数据的增删查改操作均在缓冲池bufferPool中完成,并且缓冲区中其他组件的描述信息也都存储在…

[Linux]Vi和Vim编辑器

Vi和Vim编辑器 Linux系统会内置vi文本编辑器, 类似于windows中的记事本 Vim具有程序编辑的能力, 可以看作是Vi的增强版本, 可以进行语法检查, 代码补全,代码编译和错误调整等功能 Vi和Vim的模式 快速入门 使用vim开发一个Hello.java程序 通过Xshell连接Linux系统命令行输入…

技术美术百人计划 | 《4.5 DOF景深算法》笔记

1. 景深定义 景深(Depth of Field,DOF),是指在摄影机镜头或其他成像器前沿能够取得清晰图像的成像所测定的被摄物体前后距离范围。镜头光圈、镜头焦距、及焦平面到拍摄物的距离是影响景深的重要因素。在聚焦完成后,焦点…

2024年Q3国际信息系统安全认证联盟(ISC2)内部研讨会要点分享

2024年是CISSP认证成立30周年,这是一项具有里程碑意义的成就,代表了CISSP在网络安全领域的卓越、创新和领导力。博主于今年9月份参加了ISC2(国际信息系统安全认证联盟)组织的2024年第3季度内部网络研讨会,针对会议中的…

【sgCreateCallAPIFunction】自定义小工具:敏捷开发→调用接口方法代码生成工具

<template><div :class"$options.name" class"sgDevTool"><sgHead /><div class"sg-container"><div class"sg-start"><div style"margin-bottom: 10px">调用接口方法定义列表</div…

QT 带箭头的控件QPolygon

由于对当前项目需要绘制一个箭头控件&#xff0c;所以使用了QPainter和QPolygon来进行绘制&#xff0c;原理就是计算填充&#xff0c;下面贴出代码和效果图 这里简单介绍下QPolygon QPolygon是继承自 QVector<QPoint>那么可以很简单的理解为&#xff0c;他就是一个点的…

探索丹摩智算平台的奇妙之旅:我的CogVideoX实践实验与深刻体验

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀CogVideoX &#x1f4d2;1. 初识CogVideoX&#x1f4da;2. 部署与准备&#x1f31e;在丹摩智算平台上创建实例&#x1f338;CogVideoX代码仓库…

Linux基础命令——账户简单管理

一.添加用户 命令&#xff1a;useradd username eg:useradd yy 添加用户名为yy的用户 注意&#xff1a; inux中如果新建用户的时候没有用-d参数指定家目录&#xff0c;那么用户的家目录是什么? 指定的默认/home下面&#xff0c;以username命名 二.修改账户口令/密码 命令&…

漫步者头戴式耳机哪个型号好?热门主流头戴式耳机专业深度评测

一直以来头戴式蓝牙耳机凭借其独特的优势&#xff0c;逐渐成为了音乐爱好者、游戏玩家以及日常通勤者的首选&#xff0c;它们不仅融合了卓越的音质体验、便捷的无线连接&#xff0c;还融入了先进的降噪技术和人性化的佩戴设计&#xff0c;为用户带来了前所未有的听觉盛宴与舒适…

css实现居中的方法

水平居中 1. 行内设置text-align 给父元素设置text-align为center&#xff0c;一般用于实现文字水平居中 2. 给当前元素设置margin&#xff1a;0 auto 原理&#xff1a;块级独占一行&#xff0c;表现为在水平方向上占满整个父容器&#xff0c;当水平方向padding&#xff0c;…

500元以内头戴式耳机哪款好?盘点500元以内百元宝藏品牌机型推荐

作为耳机发烧友&#xff0c;我深知一副优质的头戴式耳机都能为我们带来沉浸式的听觉体验&#xff0c;但然而&#xff0c;面对市场上琳琅满目的耳机品牌和型号&#xff0c;500元以内头戴式耳机哪款好&#xff1f;对于这个问题我将为大家盘点500元以内百元宝藏品牌机型推荐无论你…

【chromedriver编译-绕过selenium机器人检测】

有小伙伴说使用selenium没能绕过机器人检测&#xff0c;盘他。 selenium机器人检测有2种&#xff0c;一是cdp检测&#xff0c;二是webdriver特征检测。cdp检测前面的博客已写过&#xff0c;这里就提下webdriver特征检测。一、selenium简介 Selenium 是一个强大的工具&#xff…

浅析OceanBase数据库的向量化执行引擎

本篇博客是偏数据库系统概念性的内容&#xff0c;不会深入到 OceanBase 中各个算子和表达式的在向量化中的详细设计和实现。 背景 为了提升OceanBase社区版用户解决问题的效率&#xff0c;OceanBase官方不久前推出了《OceanBase 从入门到实践》系列课程。在第七期直播课程后&a…

Linux笔记---简单指令

1. 使用的环境 博主使用的是华为云服务器xshell终端的方式学习的&#xff0c;因为据说这样的方式比较接近以后的工作环境。 其中云服务器安装的是Ubuntu操作系统(以Linux为内核&#xff0c;适合新手学习Linux的一个版本) 这里的云服务器不一定使用华为的&#xff0c;但是我在…

基于Spring JDBC AbstractRoutingDataSource 实现动态数据源

AbstractRoutingDataSource 实现动态数据源 AbstractRoutingDataSource 即抽象的路由数据源&#xff0c;提供了动态数据源切换的机制。你可以通过实现它的 determineCurrentLookupKey() 方法&#xff0c;根据不同的条件返回对应的数据源 key&#xff0c;基于这点可以根据外部输…

OpenRestry(一个Nginx集成工具)的安装与使用

文章目录 一、OpenRestry介绍1、什么是Nginx呢&#xff1f;2、Nginx的反向代理3、Nginx的作用4、什么是OpenRestry&#xff1f; 二、OpenRestry的安装三、OpenRestry中nginx的使用1、Ngnix可以当做web服务器2、Nginx中可以编写Lua脚本 一、OpenRestry介绍 要想了解什么是OpenR…

ChatGPT搭上langchain的知识库RAG应用,效果超预期

最近利用LangchainChatGPT实现了上传文档实现个人知识库应用的能力&#xff0c;效果比想象得要好。文末大家可以体验一下效果~~ 给大家大致介绍下实现方式&#xff0c;参考了Langchain chatchat。 一、LangchainChatGPT 1、概述 LangChain 是一个强大的框架&#xff0c;可以…

数据技术进化史:从数据仓库到数据中台再到数据飞轮的旅程

随着大数据时代的到来&#xff0c;数据已经成为企业的核心资产之一。在过去几十年间&#xff0c;数据技术也随之不断演进&#xff0c;从早期的数据仓库到近年来热门的数据中台&#xff0c;再到正在快速发展的数据飞轮概念&#xff0c;每一步都是技术革新的体现。 一、数据仓库&…

信息安全工程师(10)网络信息安全法律与政策文件

前言 网络信息安全法律与政策文件是保障网络安全、维护网络空间秩序、保护公民和组织合法权益的重要基石。 一、主要法律文件 《中华人民共和国网络安全法》 发布时间&#xff1a;2016年11月7日&#xff0c;由第十二届全国人民代表大会常务委员会第二十四次会议通过。主要内容&…

9。maven必备小技巧

&#xff08;1&#xff09;配置Maven加速时&#xff0c;除了settings之外&#xff0c;还可如下图所示&#xff0c;配置如下&#xff1a; 若想实现Maven加速&#xff0c;最重要的即User settings file。&#xff08;先修改settings.xml&#xff09; &#xff08;2&#xff09;当…