JAVAEE初阶相关内容第十六弹--网络原理之TCP_IP

目录

1. TCP-IP五层模型

2. UDP协议

2.1 特点

2.2 UDP协议端格式

2.3 校验和

3. TCP协议

3.1 特点

3.2 TCP协议段格式

3.2.1 首部长度

3.2.2 选项

3.2.3 保留6位

3.3 TCP内部的工作机制

3.3.1 确认应答

(1)应答报文ack

(2)小结

3.3.2 超时重传

3.3.3 连接管理

3.3.4 滑动窗口

窗口大小

3.3.5流量控制

3.3.6拥塞控制

3.3.7延迟应答

3.3.8稍带应答

3.3.9面向字节流

3.3.10异常情况


1. TCP-IP五层模型

应用层-数据具体要怎么使用。

传输层-只考虑起点和终点。

网络层-负责任意两个结点之间的传输、路径规划。

数据链路层-负责相邻节点间的数据传输。

物理层-信息传输的公路。

下面的四层都是在系统内核/驱动程序/硬件中已经实现好的,只能了解不能修改。

应用层协议是可以自定义的。自定义协议主要是做两件事:

1.明确协议数据要传递哪些信息(根据需求来的)

2.明确数据组织格式,比如按照纯文本的方式,也可以使用xml、json、protobuffer

应用层除了上述自定义的协议之外,也有一些大佬们设计好的现成的协议,最典型的就是http协议。

传输层虽然是操作系统内核已经实现好了,但是程序员写代码,要调用系统提供的socket api完成网络编程的,socket就是属于传输层的部分。

端口号是传输层协议的概念,TCP和UDP协议报头中都会包含源端口和目的端口,这俩都是使用2个字节,16个比特位表示的。

需要熟背的内容

1个字节 8 bit  范围 -128到+127           0-255

2个字节16bit 范围-32768到+32767     0-65535

4个字节 32bit 范围 -21亿到+21亿        0-42亿9千万

一个端口号的取值范围是0-65535,但是自己写的程序绑定的端口号得是从1024起的。

0-1023这个范围的端口,称为“知名端口号/具名端口号”,这些端口号是属于已经分配给了一些知名的广泛使用的应用程序了。

端口号:数据库mysql默认端口3306,起到的效果就是区分一个主机上具体的应用程序,要求在同一个主机上,一个端口号不能被多个进程绑定。

2. UDP协议

2.1 特点

无连接、不可靠、面向数据报、全双工。

2.2 UDP协议端格式

一次网路通信涉及到五元组:源IP、源端口、目的IP、目的端口、协议类型

UDP报头里包含了一些特定的属性,就携带了一些重要的信息。不同的协议,功能不同,报头中带有的属性信息也不同,对于UDP来说,报头一共就是8个字节。分成4个部分(每个部分两个字节)。

16位UDP长度,表示整个数据报(UDP首部+UDP数据)的最大长度;2个字节,范围0-65535;换算单位为64KB,一个UDP数据报最大只能传输64KB的数据。如果应用层数据报超过64KB,咋办?

(1)就需要在应用层,通过代码的方式针对应用层数据报进行手动的分包,拆分成多个包通过多个UDP数据报进行传输(本来需要send一次,现在需要send多次)

(2)不用UDP,换成TCP(TCP没有这样的限制)

2.3 校验和

如果校验和出错,就会直接丢弃。

校验和的作用是验证传输的数据是否是正确的;网络传输过程中,可能会受到一些干扰,在这些干扰下就可能出现“比特翻转”的情况。网络传输的本质是光信号/电信号,就会受到一些物理环境的影响,所以就引入了校验和来进行鉴别,针对数据内容进行一系列的数学运算,得到一个比较短的结果,如果数据内容一定,得到的校验和结果就一定,如果数据变了,得到的校验和也就变了。

针对网络传输的数据来说,生成校验和的算法有很多种,其中比较知名的几个:

1.CRC 

循环冗余检验

简单粗暴,把数据的每个字节,循环往上累加,如果累加溢出了,高位就不要了。【优点:好算,但是校验效果不是特别理想,万一数据同时变了两个比特位,就容易出现内容变了,CRC没变这样的情况】

2.MD5

不是简单相加,有一系列公式,来进行更复杂的数学运算(数学问题)

特点:

(1)定长,无论原始数据多长,得到的MD5值都是固定长度(4字节版本,也有8字节版本)

(2)冲突概率很小,原始数据哪怕只变动一个地方,算出的MD5值都会差别很大(让MD5结果更分散了)

(3)不可逆。通过原始数据计算MD5很容易,通过MD5还原成原始数据很难,理论上是不可实现的。

MD5的特点让它的作用更多了:校验和、作为计算哈希值的方式、加密

3.SHA1

3. TCP协议

TCP Transmission Control Protocol 传输控制协议

3.1 特点

有连接、可靠、面向字节流、全双工

3.2 TCP协议段格式

3.2.1 首部长度

一个TCP报头,长度是可变的,不是像UDP一样固定是8个字节。因此,首部长度就描述了TCP报头具体多长。另外选项之前的部分是固定长度(20字节:一行是4个字节

【此处的首部长度是4比特位】

3.2.2 选项

首部长度 - 20 字节得到的就是选项部分的长度。

如果首部长度值是5,表示整个TCP报头的长度是20字节【相当于没有选项】

如果首部长度值是15,表示整个TCP报头是60字节【选项长度相当于是40字节】

3.2.3 保留6位

保留6位是为了以后的扩展来考虑的,对于网络协议来说,扩展升级,是一件成本极高的事情,比如UDP,报文长度是2字节,因此一个包最大就是64KB,现在是否可以能把UDP协议升级,让他支持更大的长度,比如把报头长度使用4字节表示??

理论上可行但实际的操作成本极高。这不是技术问题,而是营销问题。需要升级设备中的操作系统。但是如果引入“保留位”,此时升级操作的成本就会降低不少,如果后续TCP引入了一些新的功能,就可以使用保留位的字段,此时对于TCP本来的报头结构的影响比较小,老的设备即使不升级,也可以兼容。

3.3 TCP内部的工作机制

3.3.1 确认应答

实现可靠传输最核心的机制。可靠不是说发送方百分百可以将消息发给接收方,而是尽可能的把数据进行传输,同时如果还是传输不过去,至少能知道。

(1)应答报文ack

ack = 1 -- 应答报文

任何一条数据(包括应答报文)都是有序号的,确认序号,则是只有应答报文有(普通报文确认序号字段里的值无意义)

应答报文中确认序号填写的是1001,就是在数据1000上+1,表示的含义

a.小于1001的数据都已经确认收到了

b.A接下来该从1001这个序号开始继续发送

(2)小结

TCP可靠传输能力,最主要的就是通过确认应答机制保证的。通过应答报文,就可以让发送方清楚的知道是否传输成功,进一步引入序号和确认序号,针对多组数据进行详细区分【网络上可能存在“后发先至”这个情况下,收到的消息的顺序可能是存在变数的】

3.3.2 超时重传

超过一定的时间没响应,就重新传输。

TCP对于重复数据的传输有特殊的处理【去重】

TCP存在一个“接收缓冲区”,这样的存储空间【接收方的操作系统内核里的一段内存】

对确认应答一个重要补充:一旦出现丢包的情况,就要重新进行传输。发送方卡一个超时时间,指定时间范围内都没有收到ack,此时就认为丢了,需要重传。【数据报丢了:直接重传。ack丢了:就说明接收方会收到两份一样的数据,tcp会根据序号针对收到的消息进行去重】

3.3.3 连接管理

连接【Connection】:抽象的概念。

意义:

通信双方各自建立对对方的“认同”

验证通信双方各自的发送能力与接收能力是否ok

在握手的过程中,双方协商一些重要参数。

三次握手:syn【尝试建立连接】 ack【应答】   四次交互,中间两次交互可以合二为一。

四次挥手:断开连接。通信双方各自给对方发送一个FIN【结束报文段】,再各自给对方返回一个ack【由于中间的两次时间并不尽相同,ack是立即返回的,下一条FIN是代码里执行到close方法,才触发的,因此是四次,如果中间间隔真的很短或者加上了延迟应答这样的机制,四次挥手也是可能会合并成三次的】

理解:TIME_WAIT

出现在主动发起断开连接的一方客户端需要等待一个2MSL【互联网上两个结点之间的数据传输消耗的最大时间】(Max Segment Life,报文最大生存时间)的时间,才会进入CLOSDE状态。 

3.3.4 滑动窗口

一发一收的方式性能较低,一次发送多条数据就可以大大提高性能。(将多个时段的等待时间重叠在一起了)提升效率不等于高效。确认应答、超时重传、连接管理保证了TCP的可靠性。【可靠性和传输效率本身是矛盾的】

窗口大小

无需等待确认应答而可以继续发送数据的最大值。

操作系统内核为了维护这个滑动窗口,需要开辟发送缓冲区来记录当前还有哪些数据没有应答;只有确认应答过的数据,才能从缓冲区删掉。

窗口越大,网络的吞吐率就越高。

能够根据接收方的处理能力制衡发送方的发送速率

滑动窗口的本质是降低了确认应答、等待ACK的时间。【进行IO操作的时候,时间成本主要是两个部分等待和数据传输。大多数情况下都是在等】

出现了丢包,如何进行重传?【分两种情况讨论】

a.数据包已抵达,ACK被丢了

ack丢了不要紧,因为可以通过后续的ACK进行确认。

b.数据包直接丢了

当一段报文段丢失之后,发送端会一直收到1001这样的ACK,就像是在提醒发送端“我想要的是1001”一样。

如果发送端主机连续三次收到了同样的一个“1001”这样的应答,就会将对应的数据1001-2000重新发送。

这时接收端收到1001之后,再次返回的ACK就是7001(2001-7000接收端其实之前就已经收到了,被放到了接收端操作系统内核的接收缓冲区中)

这种机制也叫做“高速重发控制”【快重传】--超时重传机制在滑动窗口下的变形。

3.3.5流量控制

一种干预发送窗口大小的机制。

滑动窗口,窗口越大,传输效率越高,但是窗口不能无限大。

(1)完全不等ACK可靠性就不能保障

(2)窗口太大,消耗系统资源

(3)发送速度太快,接收方处理不过来,发了也白发。

约束依据:接收方的处理能力。

接收方处理数据的速度是有限的,如果发送端发的太快,导致接收端的缓冲区被打满,这个时候发送端继续发送,就会造成丢包,继而引起丢包重传等一系列连锁反应。

因此TCP支持根据接收端的处理能力,来决定发送端的发送速度,这个机制就叫做流量控制。

直接看接收方接收缓冲区的剩余大小。

如何把窗口大小告诉发送端?

在TCP的首部,有一个16位窗口字段,就是为了存放窗口大小信息。16位数字最大表示65535,那么TCP窗口的最大就是65535个字节么?

TCP首部40字节选项中还包含一个窗口扩大因子M,实际窗口大小是窗口字段的值左移M位。

3.3.6拥塞控制

流量控制【接收方的处理能力】+拥塞控制【传输过程中中间结点的处理能力 不好衡量,通过“实验”测试,逐渐找到一个合适的窗口大小】共同决定了发送方的窗口大小是多少【取较小值】。

拥塞窗口的值不是固定不变的,而是一直动态变化的。

先指数增长,之后线性增长之后回跳【热恋】

3.3.7延迟应答

如果接收数据的主机立刻返回ACK应答,这时候返回的窗口可能比较小。在接收方能够处理的了的前提下,尽可能的把窗口放大。

延迟:收到数据之后,不是立即返回ACK,而是稍微等会再返回。等待的时间里,接收方的应用程序,就能把接收缓冲区的数据消费一波,这样剩余空间就更大了

3.3.8稍带应答

也是提升效率的方式,在延迟应答的基础上,引入了捎带应答。

能够合并。

3.3.9面向字节流

粘包问题,明确两个包的边界:分隔符、长度。

3.3.10异常情况

出现了不可抗力的因素。

进程崩溃了

主机关机

进程没了,对应的PCB就没了,对应的问价描述符表就释放了,相当于socket.close();

此时内核会继续完成四次挥手,此时其实仍然是一个正常断开的流程。

主机关机要先杀进程,然后再正式关机(杀死进程的过程中,也是和上面一样触发四次挥手)

主机掉电

网线断开

假设是接收方掉电,发送方仍然再继续发送数据,发完数据要继续等待ACK,ACK等不到,超时重传,再怎么重传也收不到ACK,重传几次,还是没有应答,尝试重置tcp连接,(复位报文段  RST),显然这个重置也会时报,放弃连接。

如果是发送端掉电,接收方发现没有数据了,没数据是发送方挂了还是发送方要组织下语言重新发送接收方是不知道的,接收方选择先等,周期性的给发送方发送一个消息,确认下对方是否还正常工作。【心跳包--心跳是周期性的,如果心跳无了,就说明挂了,使用心跳包来确认通信双方是处在正常的工状态中】

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Filament】Filament环境搭建

1 前言 Filament 是一个实时物理渲染引擎,用于 Android、iOS、Linux、macOS、Windows 和 WebGL 平台。该引擎旨在提供高效、实时的图形渲染,并被设计为在 Android 平台上尽可能小而尽可能高效。Filament 支持基于物理的渲染(PBR)&…

【Vue】使用 Vue CLI 脚手架创建 Vue 项目(使用GUI创建)

前言 在开始使用Vue进行开发之前,我们需要先创建一个Vue项目。Vue CLI(Command Line Interface)是一个官方提供的脚手架工具,可以帮助我们快速创建Vue项目。Vue CLI也提供了一个可视化的GUI界面来创建和管理Vue项目。 步骤 打开终…

接口获取数据控制台打印有值但是展开又没有了

谷歌浏览器只会展现响应式数据最后的结果,证明原来接口是有值的,后面对这个数据进行操作后,最终没有值了。所以对数据进行操作时最好对数据进行一次深拷贝 JSON.parse(JSON.stringify(data))

任意文件上传漏洞实战和防范

文件上传漏洞广泛存在于Web1.0时代,恶意攻击者的主要攻击手法是将可执行脚本(WebShell)上传至目标服务器,以达到控制目标服务器的目的。 此漏洞成立的前提条件至少有下面两个: 1.可以上传对应的脚本文件,…

图解系列--HTTPS,认证

确保 Web 安全的HTTPS 1.HTTP 的缺点 1.1.通信使用明文可能会被窃听 加密处理防止被窃听 加密的对象可以有这么几个。 (1).通信的加密 HTTP 协议中没有加密机制,但可以通过和 SSL(Secure Socket Layer,安全套接层)或TLS&#xff…

Redis持久化及常见问题解决

持久化缓存雪崩缓存穿透缓存击穿缓存预热 持久化 Redis的储存形式:一份在内存、一份在磁盘。内存的是最新的;磁盘里的会隔一段时间更新。 Redis持久化方式: RDB:快照方式;将某⼀个时刻的内存数据,以⼆进制的⽅式写⼊…

Vue框架学习笔记——列表渲染:v-for

文章目录 前文提要代码正文 前文提要 本人仅做个人学习记录&#xff0c;如有错误&#xff0c;请多包涵 主要学习链接&#xff1a;尚硅谷Vue2.0Vue3.0全套教程丨vuejs从入门到精通 代码正文 <body><div id"box"><ul><li v-for"(p,index)…

基于Python自动化测试框架之接口测试

前段时间由于公司测试方向的转型&#xff0c;由原来的web页面功能测试转变成接口测试&#xff0c;之前大多都是手工进行&#xff0c;利用postman和jmeter进行的接口测试&#xff0c;后来&#xff0c;组内有人讲原先web自动化的测试框架移驾成接口的自动化框架&#xff0c;使用的…

leetcode算法之栈

目录 1.删除字符串中的所有相邻重复项2.比较含退格的字符串3.基本计算器II4.字符串解码5.验证栈序列 1.删除字符串中的所有相邻重复项 删除字符串中的所有相邻重复项 class Solution { public:string removeDuplicates(string s) {string ret;//使用数组模拟栈操作for(auto …

龙迅#LT6911GX是一款高性能HDMI2.1至MIPI或LVDS芯片,支持图像处理,DSC压缩和嵌入式LPDDR4 旋转功能!

1.描述 应用功能&#xff1a;LT6711GX适用于HDMI2.1转MIPICSI/DSI&#xff1b;HDMI2.1转LVDS&#xff0c;支持高刷模式&#xff0c;带HDCP 方案&#xff01; 分辨率&#xff1a;最高支持8K30HZ 工作温度范围&#xff1a;−40C to 85C 产品封装&#xff1a;BGA169&#xff08;9*…

clip-path,css裁剪函数

https://www.cnblogs.com/dzyany/p/13985939.html clip-path - CSS&#xff1a;层叠样式表 | MDN 我们看下这个例子 polygon里有四个值分别代表这四个点相对于原图左上方的偏移量。 裁剪个五角星

【跨境营商】创新科技助力数码转型 增强大湾区企业核心竞争力

粤港澳大湾区作为国家的重点发展区域&#xff0c;坐拥丰富的资源及商机&#xff0c;企业积极推行数码化&#xff0c;务求在大湾区抢占先机。香港电讯商业客户业务董事总经理吴家隆表示&#xff0c;近年企业锐意加快数码化步伐&#xff0c;香港电讯以创新科技融入的数码方案&…

解密Prompt系列20. LLM Agent之再谈RAG的召回多样性优化

几个月前我们就聊过RAG的经典方案解密Prompt系列14. LLM Agent之搜索应用设计。前几天刚看完openAI在DevDay闭门会议上介绍的RAG相关的经验&#xff0c;有些新的感悟&#xff0c;借此机会再梳理下RAG相关的优化方案。推荐直接看原视频&#xff08;外网&#xff09;A Survey of …

Fiddler的配置、原理和使用

一、Fiddler的工作原理 本地应用与服务器之间所有的请求&#xff08;request&#xff09;和响应&#xff08;response&#xff09;&#xff0c;由fiddler进行转发&#xff0c;此时fiddler以代理服务器的方式存在。 由于所有的网络数据都要经过fiddler&#xff0c;因此&#xf…

Proteus仿真--基于51单片机的DS18B20温度采集及报警

本文介绍基于DS18B20温度采集及报警的仿真设计&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真图如下 其中温度传感器选用DS18B20器件&#xff0c;主要用于获取温度数据并上传&#xff0c;温度显示选用数码管&#xff0c;报警模块选用蜂鸣器 仿真运行视频 Pr…

vue3 vue-router的安装及配置 (一)

文章目录 一、安装二、Vue Router配置2.1 vue-router两种引入方式的区别2.2 不同的历史模式 三、router-link四、router-view Vue Router作用&#xff1a;在应用程序中实现优雅的导航和路由管理。 一、安装 注意&#xff1a;vue3安装的是vue-router4,vue2安装的是vue-router3…

C#网络编程TCP程序设计(Socket类、TcpClient类和 TcpListener类)

目录 一、Socket类 1.Socket类的常用属性及说明 2.Socket类的常用方法及说明 二、TcpClient类 三、TcpListener类 四、示例 1.源码 2.生成效果 TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在C#中&#xff0c;TCP程序设…

.Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)

机缘 不知不觉,.NET8都已经面世,而我们一直还停留在.netframework4.5开发阶段,最近准备抽空研究一下.Net6,一是为了提高技术积累,一方面想着通过这次的学习,看有没有可能将老的FX版本替换到.Net6开发上,经过查找官方资料,对.Net6支持的系统版本做一个分享,方便大家后期…

css设置渐变色

css如何设置自定义渐变色&#xff1f;线性渐变篇 CSS渐变可以让你在两个或多个指定颜色之间显示平滑的过渡。 CSS定义了三种渐变类型: Linear Gradients (goes down/up/left/right/diagonally) 下降/ 上升/左/右/对角线Radial Gradients (defined by their center) 由中心定…

RocketMQ - SpringBoot整合RocketMQ

SpringBoot整合RocketMQ 1、快速实战 ​ 按照SpringBoot三板斧&#xff0c;快速创建RocketMQ的客户端。创建Maven工程&#xff0c;引入关键依赖&#xff1a; <dependencies><dependency><groupId>org.apache.rocketmq</groupId><artifactId>r…