网络原理---TCP/IP

活动发起人@小虚竹 想对你说:

这是一个以写作博客为目的的创作活动,旨在鼓励大学生博主们挖掘自己的创作潜能,展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴,那么,快来参加吧!我们一起发掘写作的魅力,书写出属于我们的故事。我们诚挚邀请你参加为期14天的创作挑战赛!

提醒:在发布作品前,请将不需要的内容删除。

1.应用层

我们之前编写完了基本的 java socket ,要知道,我们之前所写的所有代码都在应⽤层,都是为了 完成某项业务,如翻译等。关于应⽤层,我们在讲解完毕基本的 TCP/IP 协议之后,我们会单独来进 ⾏讲解。

2.传输层

负责数据能够从发送到传输到接收端。

2.1 再谈端口号

端口号标识了一个主机上进行通信的不同的应用程序。

在TCP/IP协议中,⽤"源IP","源端⼝号","⽬的IP","⽬的端⼝号","协议号"这样⼀个五元组来标识⼀个 通信(可以通过netstat-n查看);

端⼝号范围划分

• 0-1023:知名端⼝号,HTTP,FTP,SSH等这些⼴为使⽤的应⽤层协议,他们的端⼝号都是固定的.

• 1024-65535:操作系统动态分配的端⼝号.客⼾端程序的端⼝号,就是由操作系统从这个范围分配 的.

2.2UDP协议

UDP协议格式

• 16位UDP⻓度,表⽰整个数据报(UDP⾸部+UDP数据)的最⼤⻓度; 如果校验和出错,就会直接丢弃;

UDP的特点:

  • 无连接:知道对端的IP和端⼝号就直接进⾏传输,不需要建⽴连接,
  • 不可靠传输:没有确认机制,没有重传机制;如果因为⽹络故障该段⽆法发到对⽅,UDP协议层也不会给应 ⽤层返回任何错误信息;(如何理解这里的不可靠,⾯向数据报 应⽤层交给UDP多⻓的报⽂,UDP原样发送,既不会拆分,也不会合并;)
  • 面向数据报:不能够灵活的控制读写数据的次数和数量
  • 全双工

我们接下来了解UDP报头,我们所熟知的HTTP协议的报头是文本格式的,UDP/TCP/IP的报头是二进制格式的。

长度

整个UDP数据报长度(报头+载荷),长度属性也是两个字节,表示范围0~65535(64KB).

端口号

一个端口号的取值范围是0~65535,实际上一般把1024以下的端口保留,我们写代码都用1024~65535这个范围的。服务器的端口是程序员指定的(提前指定好,客户端才能访问到),客户端的端口是系统自动分配的空闲端口(如果提前指定了,可能会与你客户端上的程序起冲突)。

校验和

验证数据是否发生修改,之前我们将HTTP的数字签名是为了防止黑客篡改(防人),但UDP的校验和不是为了防人,和安全性无关,而是为了防止出现运输过程中的“比特翻转”(即1变0,0变1)。

发送之前,先计算一个校验和,把整个数据包的数据都代入,把数据与校验和一起发送给对端,接收方收到之后重新计算一下校验和,和收到的校验和进行对比(UDP发现校验和不一致,就会直接丢弃)。UDP的校验和使用了CRC方式来进行校验(循环冗余校验),把每个字节(除了校验和位置的部分之外),都当做整数,进行累加,溢出来也没有关系,继续加最终得到结果,crc校验和传输到对端,数据出现错误了,对端再次 计算的校验和就会和第一个校验和不以样。

认为两个原始数据相同,使用相同的校验和算法,得到的校验和也应该是相同的,反之,两个校验和相同,原始数据一定也相同(可能存在变数)。

UDP使⽤注意事项

UDP总长度最大是64KB,可以表述为UDP总长度达到64KB或UDP携带的载荷长度达到64KB上限。

我们注意到,UDP协议⾸部中有⼀个16位的最⼤⻓度.也就是说⼀个UDP能传输的数据最⼤⻓度是 64K(包含UDP⾸部). 然⽽64K在当今的互联⽹环境下,是⼀个⾮常⼩的数字.如果我们需要传输的数据超过64K,就需要在应⽤层⼿动的分包,多次发送,并在接收端⼿动拼装。

2.3TCP协议

TCP协议特点:有链接,面向字节流,可靠传输,全双工。

TCP协议段格式

1.16位源端口号/16位目的端口号:传输层的核心内容;

2.4位首部长度:表⽰该TCP头部有多少个32位bit(有多少个4字节);所以TCP头部最⼤⻓度是15* 4=60。

3.选项:选项的存在,导致tcp报头长度是可变的。

4.保留6位:TCP报头中就预留了一些“保留位”,现在先不用,但是先占个位子。

5.:TCP最核心的6个标志位

  •  URG:紧急指针是否有效.
  •  ACK:确认号是否有效,ack为1,表示是应答报文.
  •  PSH:提⽰接收端应⽤程序⽴刻从TCP缓冲区把数据读⾛.
  •  RST:对⽅要求重新建⽴连接;我们把携带RST标识的称为复位报⽂段.
  • SYN:请求建⽴连接;我们把携带SYN标识的称为同步报⽂段.
  •  FIN:通知对⽅,本端要关闭了,我们称携带FIN标识的为结束报⽂段.

6.16位校验和:用来校验数据是否出现错误.

7.针对确认应答中的情况,给数据进行编号,其中确认序号只在应答报文中才生效。

8.16位紧急指针:标识哪部分数据是紧急数据

TCP的核心机制

可靠性:此处的可靠性,不是说A给B发一个消息,B100%能收到,而是A给B发了消息之后,尽量让B收到消息。

TCP核心机制一:确认应答

保证可靠性的一个关键前提,发送方知道自己的数据是否被对方收到,需要对方给返回一个“应答报文”(acknowledge.ack),发送方知道应答报文,就可以确认对方收到了。

举个例子,我们用短信给别人发送多条消息时,正常情况下,如图所示

但是在网络上会出现后发先至的情况,如图所示,这种情况会引起误解,

那么针对这种情况,我们又该如何解决,接下来我们介绍一下TCP的解决方案

TCP将每个字节的数据都进行了编号,即为序列号。上述列子编号如上图所示:

每⼀个ACK都带有对应的确认序列号,意思是告诉发送者,我已经收到了哪些数据;下⼀次你从哪⾥开始 发.

1.TCP是面向字节流的,在编号时,不是按照用条、2条来编号的,而是按照“字节”的方式来编号的,每个字节都分配一个编号,编号是连续递增的。

        一个TCP的载荷是由多个字节构成的,需要多个编号,那么此处的序号该怎么填写:序号字段填写载荷部分的第一个字节的序号,序号连续递增;确认序号填法是把收到的载荷数据的最后一个字节序号+1。

2.引入序号之后,接收方就可以根据序号对数据进行排序,TCP需要先处理后发先至的情况,确保应用程序通过socket api读到的数据顺序(即确保代码里读到的数据和发送方写入的数据顺序一致)是正确的。

3.TCP报头不参与排序,序号、确认序号都是针对载荷的,TCP在接收方这里会安排“接收缓冲区”,(内存,操作系统内核里),通过网卡读到的数据,先放到缓冲区中,后续代码里调用read,也是从接收缓冲区来读的。

4.在接收缓 冲中,根据序号来排序,序号小的在前面,大的在后面,确保前面的数据已经到了,然后read才能接触阻塞,如果是后面的数据先到,read会继续阻塞,不会读取到数据。

TCP核心机制二:超时重传

1.超时重传是针对丢包的情况做出处理,这里首先会设置一个超时时间,

比如A给B发送数据等B的回应,如果达到等待时间上限,还没有收到ack,A就认为传输过程中发生丢包情况。这里的丢包可能是A给B发生的数据丢了或者B给A返回的ack丢了。

2.为什么会发生丢包现象?

因为网络结构是非常复杂的,数据报经过某个路由器,交换机转发的时候,该路由器、交换机已经非常繁忙了,导致当前所需要转发的数据量超出路由器、交换机的转发能力上限,此时,数据报会消耗更多的时间,才能到达对方,跟糟糕的是,数据报太多,路由器、交换机根本处理不过来,接收缓冲区已满,只能丢弃。

3.丢包是不能避免的客观现象,而重传是有效对抗丢包的手段。

4.如何判断是否丢包?

引入超时时间来判断是否丢包,TCP中,判断超时时间的阈值,不是固定数值,是动态改变的。

假设当前A向B发送数据,丢包时间的阈值是T,当A给B传输发生超时之后,就会延长这个时间阈值,即延长这个时间,但不是无休止的,超时次数达到一定程度或等待时间达到一定程度,就会认为网络出现严重故障,放弃这一次传输。

5.针对A给B发生的数据丢了或者B给A返回的ack丢了这两种情况,发送方A区分不了当前是那种情况,所有都重传。

情况1

A给B发生的数据丢了,直接重传就可以了。

情况2

对于这种情况,B已经收到了一份数据,如果重传,B就会收到两份一样的数据,如果tcp不处理,可能会使应用层读到两次一样的数据,所以tcp会在内部进行去重操作,此时根据序号,在接收缓冲区中寻找,如果存在,就直接丢弃;如果不存在,才放进去。

注:确认应当和超时重传是TCP最核心的两个机制,保证了TCP能够进行可靠运输

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

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

相关文章

【大语言模型笔记进阶一步】提示语设计学习笔记,跳出框架思维,自己构建提示词

一、大语言模型应用场景 1. 文本生成 文本创作: 诗歌故事,剧本,推文帖子 摘要与改写: 长文本摘要与简化,多语言翻译与本地化 结构化生成: 表格,根据需求生成代码片段,API文档生成…

Unity XR-XR Interaction Toolkit开发使用方法(十一)组件介绍(XR Interactable)

目录 一、插件介绍 二、主要组件 XR Interaction Manager XR Controller XR Interactor XR Direct Interactor XR Ray Interactor XR Socket Interactor XR Gaze Interactor XR Interaction Group 三、XR Interactable 1、组件介绍 2、核心功能与特点 交互类型支…

Spring Boot spring-boot-maven-plugin 参数配置详解

一 spring-boot-maven-plugin 插件的5个Goals spring-boot:repackage,默认goal。在mvn package之后,再次打包可执行的jar/war,同时保留mvn package生成的jar/war为.origin;重新打包存在的jar或者war包从而使他们可以在命令行使用…

eMMC安全简介

1. 引言 术语“信息安全”涵盖多种不同的设计特性。一般而言, 信息安全是指通过实践防止信息遭受未经授权的访问、使用、披露、中断、篡改、检查、记录或销毁。 信息安全的三大核心目标为 机密性(Confidentiality)、完整性(Integr…

Python 数据结构 2.时间复杂度和空间复杂度

Life is a journey —— 25.2.28 一、引例:穷举法 1.单层循环 所谓穷举法,就是我们通常所说的枚举,就是把所有情况都遍历了的意思。 例:给定n(n ≤ 1000)个元素ai,求其中奇数有多少个 判断一…

FFmpeg-chapter3-读取视频流(原理篇)

ffmpeg网站:About FFmpeg 1 库介绍 (1)libavutil是一个包含简化编程函数的库,包括随机数生成器、数据结构、数学例程、核心多媒体实用程序等等。 (2)libavcodec是一个包含音频/视频编解码器的解码器和编…

面试(进阶) —虚拟列表在什么场景使用,如何实现?

面试(进阶) —虚拟列表在什么场景使用,如何实现? 在前端开发中,当需要渲染大量数据时,传统的渲染方式往往会遇到性能瓶颈。一次性将大量数据渲染到DOM中,不仅会导致页面加载缓慢,还可能占用大量内存&#x…

Linux Mem -- 关于AArch64 MTE功能的疑问

目录 1.虚拟地址和物理地址映射完成后,才可以设置虚拟地址对应的memory tag ? 2.各种memory allocator中的address tag从哪来,怎么产生? 2.1 vmalloc allocator 2.2 slub分配器 2.3 用户可以指定IRG指令产生的address tag 3.kasan…

python-leetcode-颜色分类

75. 颜色分类 - 力扣&#xff08;LeetCode&#xff09; class Solution:def sortColors(self, nums: List[int]) -> None:"""Do not return anything, modify nums in-place instead."""low, mid, high 0, 0, len(nums) - 1while mid < h…

ArcGIS Pro技巧实战:高效矢量化天地图地表覆盖图

在地理信息系统&#xff08;GIS&#xff09;领域&#xff0c;地表覆盖图的矢量化是一项至关重要的任务。天地图作为中国国家级的地理信息服务平台&#xff0c;提供了丰富且详尽的地表覆盖数据。然而&#xff0c;这些数据通常以栅格格式存在&#xff0c;不利于进行空间分析和数据…

【江科大STM32】TIM输出比较(学习笔记)

本章图片文字内容也为重要知识&#xff0c;请马住&#xff01; 输出比较简介 OC&#xff08;Output Compare&#xff09;输出比较输出比较可以通过比较CNT与CCR寄存器值的关系&#xff0c;来对输出电平进行置1、置0或翻转的操作&#xff0c;用于输出一定频率和占空比的PWM波形…

【网络安全 | 漏洞挖掘】利用文件上传功能的 IDOR 和 XSS 劫持会话

未经许可,不得转载。 本文涉及漏洞均已修复。 文章目录 前言正文前言 想象这样一个场景:一个专门处理敏感文档的平台,如保险理赔或身份验证系统,却因一个设计疏漏而成为攻击者的“金矿”。在对某个保险门户的文件上传功能进行测试时,我意外发现了一个可导致大规模账户接管…

飞算 JavaAI 如何让微服务开发快人一步?

在当今竞争激烈的软件开发领域&#xff0c;微服务架构因其灵活性和可扩展性备受青睐。然而&#xff0c;微服务开发过程复杂&#xff0c;从需求分析到最终代码实现&#xff0c;每个环节都需要耗费大量时间和精力。飞算 JavaAI 的出现&#xff0c;犹如一道曙光&#xff0c;为开发…

Python—Excel全字段转json文件(极速版+GUI界面打包)

目录 专栏导读1、背景介绍2、库的安装3、核心代码4、完整代码(简易版)5、进阶版(GUI)总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系列文章专栏:请点击——…

2025年光电科学与智能传感国际学术会议(ICOIS 2025)

重要信息 官网&#xff1a;www.ic-icois.org 时间&#xff1a;2025年3月14-16日 地点&#xff1a;中国-长春 简介 2025年光电科学与智能传感国际学术会议&#xff08;ICOIS 2025&#xff09;将于2025年3月14-16日在中国-长春隆重召开。会议将围绕“光学光电”、“智能传感”…

企业微信里可以使用的企业内刊制作工具,FLBOOK

如何让员工及时了解公司动态、行业资讯、学习专业知识&#xff0c;并有效沉淀企业文化&#xff1f;一份高质量的企业内刊是不可或缺的。现在让我来教你该怎么制作企业内刊吧 1.登录与上传 访问FLBOOK官网&#xff0c;注册账号后上传排版好的文档 2.选择模板 FLBOOK提供了丰富的…

YOLOv5 + SE注意力机制:提升目标检测性能的实践

一、引言 目标检测是计算机视觉领域的一个重要任务&#xff0c;广泛应用于自动驾驶、安防监控、工业检测等领域。YOLOv5作为YOLO系列的最新版本&#xff0c;以其高效性和准确性在实际应用中表现出色。然而&#xff0c;随着应用场景的复杂化&#xff0c;传统的卷积神经网络在处…

跟我学C++中级篇——定时器的设计

一、定时器 谈到定时器&#xff0c;理论上讲是各种语言和各种设计都无法避开的一个技术点。对于定时器来说&#xff0c;表面上就是一种时间间隔的处理约定&#xff0c;但对程序来说&#xff0c;可能就是设计层面、接口层面和库或框架以及系统应用的一个大集合。不同的系统&…

智能机器人加速进化:AI大模型与传感器的双重buff加成

Deepseek不仅可以在手机里为你解答现在的困惑、占卜未来的可能&#xff0c;也将成为你的贴心生活帮手&#xff01; 2月21日&#xff0c;追觅科技旗下Dreamehome APP正式接入DeepSeek-R1大模型&#xff0c;2月24日发布的追觅S50系列扫地机器人也成为市面上首批搭载DeepSeek-R1的…

PostgreSQL10 逻辑复制实战:构建高可用数据同步架构!

PostgreSQL10 逻辑复制实战&#xff1a;打造高可用数据同步架构&#xff01; 概述 PostgreSQL 10 引入了逻辑复制&#xff08;Logical Replication&#xff09;&#xff0c;为数据库高可用和数据同步提供了更灵活的选择。PostgreSQL 复制机制主要分为物理复制和逻辑复制两种&…