【JavaEE网络】网络编程及其应用概述

目录

        • 面向字节流
          • 粘包问题
        • TCP异常情况
        • TCP/UDP对比
      • 网络层重点协议
        • IP协议
        • IP地址


面向字节流
粘包问题

在面向字节流的情况下,会产生一些其他的问题:粘包问题,这里“粘”的是“应用层数据报”,通过TCP read/write的数据,都是TCP报文的载荷,也就是应用层数据。
发送方一次性是可以发送多个应用层数据报的,但是接受的时候,如何区分,从哪里到哪里是一个完整的应用层数据报?如果没设计好,接收方就很难区分,甚至产生bug!

那么如何避免粘包问题呢?归根结底就是一句话,明确两个包之间的边界

在这里插入图片描述

此处正确的做法,是合理地设计应用层协议,这件事本身在传输层这边已经无解了,需要站在应用层的角度,来解决这个问题

1.应用层协议中,引入分隔符,区分包之间的边界。

比如\n

2.应用层协议中,引入"包长度”,也能区分包之闻的边界。

比如使用最开头固定的2个字节表示包的长度,0x0003aaa

粘包问题不仅仅是TCP才有的,只要是面向字节流的机制(文件)也有同样的问题,解决方案也都是一样。要么使用分隔符,要么使用长度

TCP异常情况

网络本身就会存在一些变数,导致TCP连接不能继续正常工作了。以下是出现那些情况时TCP如何处理使其正常

  1. 进程崩溃

进程就没了=>PCB没了=>文件描述符表也就被释放了=>相当于调用了socket.close(),socket在系统内核也是一个文件,也会被放到文件描述符表中=>崩溃的一方就会发出FIN,进一步触发四次挥手,此时连接就正常释放了。此时TCP的处理和进程正常退出没啥区别

  1. 主机关机(正常步骤的关机)

正常关机,就会先尝试干掉所有的进程(强制终止进程),就和上述所说的崩溃的处理是一样的。主机关机会有一定的时间,在这个时间内四次挥手可能是挥完的,如果没挥完也没事

  1. 主机掉电(拔电源,没有任何反应的机会)

电脑瞬间黑了,此时自然就没有任何可以操作的空间了。

在这里插入图片描述

此处就涉及到"心跳包”,B这边虽然是接收方,也会周期性的给对方发起一个 不携带任何 业务数据(载荷)TCP数据报

发起这个包的目的,就是为了触发ACK,就是确认一下A是否正常工作/确认网络是否畅通.

  1. 网线断开

相当于主机掉电的升级版。

此时A和B就无法通信了
A这边发生的情况,就是主机掉电的第一种情况
B这边发生的情况,就是主机掉电的第二种情况

以上 TCP 介绍的十个核心的特性

  1. 确认应答(可靠性)
  2. 超时重传(可靠性)
  3. 连接管理(可靠性)
  4. 滑动窗口(效率)
  5. 流量控制(可靠性)
  6. 拥塞控制(可靠性)
  7. 延时应答(效率)
  8. 捎带应答(效率)
  9. 面向字节流 => 粘包问题(编程注意事项目)
  10. 异常情况处理 => 心跳包(异常情况)
TCP/UDP对比

我们说了TCP是可靠连接,那么是不是TCP一定就优于UDP呢?TCP和UDP之间的优点和缺点,不能简单,绝对的进行比较

  • TCP用于可靠传输的情况,应用于文件传输,重要状态更新等场景;
  • UDP用于对高速传输和实时性要求较高的通信领域,例如,早期的QQ,视频传输等。另外UDP可以用于广播;

网络层重点协议

在复杂的网络环境中确定一个合适的路径。

IP协议

协议头格式如下:

在这里插入图片描述

  • 4位版本号(version):指定IP协议的版本,对于IPv4来说,就是4。现有的IP协议只有两个版本,IPV4,IPV6

  • 4位头部长度(header length):IP头部的长度是多少个32bit,也就是 length * 4 的字节数。4bit表示最大的数字是15,因此IP头部最大长度是60字节。

    IP报头是可变长的

    IP报头又是带有选项的

    此处单位也是4个字节

  • 8位服务类型(Type Of Service):3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须置为0)。4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能选择一个。对于ssh/telnet这样的应用程序,最小延时比较重要;对于ftp这样的程序,最大吞吐量比较重要。

    最小延时:传输一个数据报的时间尽量短
    最大吞吐量:一定时间内传输的数据量尽量多

    最高可靠性:在传输过程中最不容易触发丢包

    最小成本:在传输过程中消耗的硬件资源最低

  • 16位总长度(total length):IP数据报整体占多少个字节。IP报头 + 载荷 的长度

  • 16位标识(id):唯一的标识主机发送的报文。如果IP报文在数据链路层被分片了,那么每一个片里面的这个id都是相同的。

  • 3位标志字段:第一位保留(保留的意思是现在不用,但是还没想好说不定以后要用到)。第二位置为1表示禁止分片,这时候如果报文长度超过MTU,IP模块就会丢弃报文。第三位表示"更多分片",如果分片了的话,最后一个分片置为1,其他是0。类似于一个结束标记。

  • 13位分片偏移(framegament offset):是分片相对于原始IP报文开始处的偏移。其实就是在表示当前分片在原报文中处在哪个位置。实际偏移的字节数是这个值 * 8 得到的。因此,除了最后一个报文之外,其他报文的长度必须是8的整数倍(否则报文就不连续了)。

    16位标识、3位标志字段、13位分片偏移:描述了整个 IP 数据报拆包组包的过程

  • 8位生存时间(Time To Live,TTL):数据报到达目的地的最大报文跳数。一般是64。每次经过一个路由,TTL -= 1,一直减到0还没到达,那么就丢弃了。这个字段主要是用来防止出现路由循环。

  • 8位协议:表示上层(传输层)协议的类型。

  • 16位头部校验和:使用CRC进行校验,来鉴别头部是否损坏。

  • 32位源地址和32位目标地址:表示发送端和接收端。(数据部从哪来到哪去)

  • 选项字段(不定长,最多40字节):略。

IP地址

网络上有那么多主机,需要有办法描述主机的具体位置。IP地址就是解决这个问题的关键。

IP地址概念

IP地址(Internet Protocol Address)是指互联网协议地址,又译为网际协议地址。

IP地址作用

IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。

IP地址格式

IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节),如:01100100.00000100.00000101.00000110。

通常用“点分十进制”的方式来表示,即 a.b.c.d 的形式(a,b,c,d都是0~255之间的十进制整数)。如:100.4.5.6。

所谓的IP地址其实是一个32位的整数(4字节),表示方式:点分十进制。因为32位的方式表示很难记忆。点分十进制:使用三个.把32位分成4部分,每个部分就是8位,1字节,每个字节范围0-255(不带符号)

IP地址不够用了怎么办?[重点]

  1. 动态分配IP(DHCP)

你这个设备,不会一直需要上网,需要上网,就分配ip,不需要就先不分配。

这种方案,只能缓解,不能根治

  1. NAT机制(网络地址转换)(理解网络结构的重点)

只需要保证在我所在的局域网内不重复即可,在别的局域网也可以使用这样的IP地址。此时,大量的设备可以使用同样的IP了(但是是在不同局域网中),此时 IP 不够用问题就得到了很大的改善了

但还是想了别的办法。把IP地址分成两大类:

  1. 内网IP:不同的局域网内的设备,内网 IP 可以重复;同一个局域网内的设备,内网 IP 不能重复

10.*

172.16.~172.31.

192.168.*

以上三种开头的是内网IP

  1. 外网IP:外网IP不能重复

局域网之间如何通信?

  1. 如果局域网内部的设备之间进行通信,肯定是可以的(局域网内部 内网 ip 都是唯一的)
  2. A局域网中的设备,想和 B 局域网中的设备通信,这个时候咋办?(当前很可能这俩设备的 ip 相同)

当前的规则是禁止的!要想通信,就需要有一个带有外网 IP 的设备进行中转

  1. 局域网内部的设备访问带有外网 IP 的设备

像平时使用的电脑,手机,都是在局域网内部使用,他们会有一个内网 IP

还有一类设备,是“服务器”,服务器可以有外网 IP

这个过程中,就涉及到 NAT 工作过程了

在这里插入图片描述

NAT机制下,意义在于说,一个外网IP代表的不一定是一个设备了,而是很多设备

上述过程是简化的,不太严谨。真实情况是,我的电脑的数据经过我家路由器,会进行 NAT,经过电信光猫,又有 NAT,经过电信路由器又有 NAT,(每次经历路由器转发,都“可能”会触发 NAT 机制,至于是否触发,取决于路由器咋配置的)

NAT机制的缺点:

  1. 效率不高
  2. 非常繁琐
  3. 不方便直接访问局域网内的设备

NAT最大的优点:纯软件实现(省钱)

  1. IPv6(从根本上解决IP地址不够用的问题)

IPv4,是 4 个字节,32位,表示 IP 地址

IPv6,是 16 个字节,128 位,表示IP 地址

2^32=42亿左右

2^128次方=4个42亿相乘,这个数字足以支持我们把地球上的每一粒砂子都分配一个 IP 地址

但由于IPv4和IPv6不兼容,要想升级IPv6就要升级路由器设备=>花钱

相比之下,NAT方案只需要路由器开发商开发出新版本的软件(路由器固件),升级软件,即可直接支持(成本非常低的)

IP地址的组成

IP地址分为两个部分,网络号和主机号

网络号标识网段,保证相互连接的两个网段具有不同的标识;

主机号标识主机,同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号;

通过合理设置网络号和主机号,就可以保证在相互连接的网络中,每台主机的IP地址都是唯一的。

  1. 同一个局域网中设备的 网络号 必须相同,主机号 必须不同
  2. 两个相邻的局域网,网络号必须不同

那么,如何划分网络号和主机号呢?

  1. 通过子网掩码识别

在这里插入图片描述

cmd后输入 ipconfig /all 就能找到

子网掩码和 IP 地址一样,也是 4 字节,32 位的整数。左侧必须是连续的 1,右侧必须是连续的 0

  1. 分类

过去曾经提出一种划分网络号和主机号的方案,把所有IP 地址分为五类

在这里插入图片描述

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

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

相关文章

AI手机,走入小径分岔的花园

博尔赫斯在他的成名作《小径分岔的花园》里,描述了一种奇妙的世界观:一个可能性被选择之后,出现了许多不同的后世,许多不同的时间。 在现实世界中,选择不会如此神奇。但站在岔路口的抉择,也一定会带来结果的…

Mysql的关联查询以及语句

一、mysql的连接查询 1、等值连接 这里是三张表的等值连接 select rp.role_id,rp.permission_id from role_permission rp, role r, permission p where rp.role_idr.id and rp.permission_idp.id 2、内连接: 角色:系统管理员 是否拥有权限&#xf…

【Docker】docker部署lnmp和搭建wordpress网站

环境准备 docker:192.168.67.30 虚拟机:4核4G systemctl stop firewalld systemctl disable firewalld setenforce 0 安装docker #安装依赖包 yum -y install yum-utils device-mapper-persistent-data lvm2 #设置阿里云镜像 yum-config-manager --add…

【Web】D^3CTF之浅聊d3pythonhttp——TE-CL请求走私

目录 step0 题目信息 step1 jwt空密钥伪造 step1.5 有关TE&CL的lab step2 TE-CL请求走私 payload1 payload2 step0 题目信息 注意到题目源码前端是flask写的,后端是web.py写的 frontend from flask import Flask, request, redirect, render_templat…

基于Python的人脸识别系统设计与实现(论文+源码)_kaic

基于Python的人脸识别系统设计与实现 摘 要 随着人工智能的发展,人脸识别系统在我们的生活中越来越被广泛应用。人脸识别系统是指能够从数字图像或视频源中识别人的技术。人脸识别系统可以通过多种方法工作,但是,它们通常是通过将给定图像中的面部特征与…

202012青少年软件编程(Python)等级考试试卷(一级)

第 1 题 【单选题】 运行下方代码段,输出是6,则输入的可能是( )。 a eval(input())print(a)A :8%2 B :8/2 C :3*2 D :3**2 正确答案:C 试题解析: 第 2 题 【单选题】 关于Python变量,下列叙述正确的是&#x…

Spring Cloud——LoadBalancer

Spring Cloud——LoadBalancer 一、负载均衡(LoadBalance)1.LoadBalancer本地负载均衡客户端 VS Nginx服务端负载均衡区别 二、LoadBalancer1.Spring RestTemplate as a LoadBalancer Client2.编码使用DiscoveryClient动态获取所有上线的服务列表3.从默认…

《自动机理论、语言和计算导论》阅读笔记:p215-p351

《自动机理论、语言和计算导论》学习第 11 天,p215-p351总结,总计 37 页。 一、技术总结 1.constrained problem 2.Fermat’s lats theorem Fermat’s Last Theorem states that no three positive integers a, b and c satisfy the equation a^n b…

过渡与动画

单元素/组件过渡 Vue在插入、更新或者移除 DOM 时,提供多种不同方式的过渡效果(一个淡入淡出的效果) 在条件渲染(使用v-if)、条件展示(使用v-show)、动态组件、组件根节点等情形中,可…

python算法题

需求 代码 class Solution:def searchInsert(self, nums: List[int], target: int) -> int:if max(nums) >target:for i in range(len(nums)-1):if nums[i1] > target and nums[i] <target:return i1if max(nums) <target:return len(nums)if min(nums) > …

操作系统(2)——进程线程

目录 小程一言专栏链接: [link](http://t.csdnimg.cn/8MJA9)基础概念线程详解进程详解进程间通信调度常用调度算法 重要问题哲学家进餐问题问题的描述策略 读者-写者问题问题的描述两种情况策略 总结进程线程一句话 小程一言 本操作系统专栏&#xff0c;是小程在学操作系统的过…

【tcl脚本实践Demo 1】文本生成、匹配、修改、读写

引言 在芯片设计的流程中,各种EDA工具在设计、综合、布局布线、验证、时序分析等等环节都会产出大量的文件信息。这些信息是海量的,如果单纯靠程序员自己查看信息效率很低并且很容易纰漏。所以脚本语言可以很好的解决这个问题,可以利用脚本语言匹配到敏感的信息,完成对信息…

240 基于matlab的飞行轨迹仿真程序

基于matlab的飞行轨迹仿真程序&#xff0c;多种不同的飞行轨迹&#xff0c;输出经度、纬度、高度三维轨迹&#xff0c;三个方向的飞行速度。程序已调通&#xff0c;可直接运行。 240 飞行轨迹仿真 三维轨迹 飞行速度 - 小红书 (xiaohongshu.com)

Golang图片验证码的使用

一、背景 最近在使用到Golang进行原生开发&#xff0c;注册和登录页面都涉及到图片验证码的功能。找了下第三方库的一些实现&#xff0c;发现了这个库用得还是蛮多的。并且支持很多类型的验证方式&#xff0c;例如支持数字类型、字母类型、音频验证码、中文验证码等等。 项目地…

动态规划-回文子串问题

文章目录 1. 回文子串&#xff08;647&#xff09;2. 最长回文子串&#xff08;5&#xff09;3. 分割回文串 IV&#xff08;1745&#xff09;4. 分割回文串 II&#xff08;132&#xff09;5. 最长回文子序列&#xff08;516&#xff09;6. 让字符串成为回文串的最少插入次数&am…

Vue入门篇:样式冲突scoped,data函数,组件通信,prop data单向数据流,打包发布

这里写目录标题 1.组件的样式冲突scoped2.data函数3.组件通信1.两种组件关系分类和对应的组件通信方案2.父子通信方案的核心流程 4.prop & data、单向数据流5.打包发布6.打包优化:路由懒加载 1.组件的样式冲突scoped 默认情况:写在组件中的样式会全局生效→因此很容易造成多…

【Python从入门到进阶】53、Scrapy日志信息及日志级别

接上篇《52、CrawlSpider链接提取器的使用》 上一篇我们学习了基于规则进行跟踪和自动爬取网页数据的“特殊爬虫”CrawlSpider。本篇我们来学习Scrapy的日志信息及日志级别。 一、引言 1、日志在Scrapy中的重要性 在Scrapy框架中&#xff0c;日志扮演着至关重要的角色。日志…

十三、大模型项目部署与交付

1 硬件选型 CUDA 核心和 Tensor 核心 CUDA 核心&#xff1a;是NVIDIA开发的并行计算平台和编程模型&#xff0c;用于GPU上的能用计算&#xff0c;可做很多的工作。应用在游戏、图形渲染、天气预测和电影特效Tensor 核心&#xff1a;张量核心&#xff0c;专门设计用于深度学习…

前端开发框架Vue

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Vue概述 Vue.js&#xff08;简称Vue&#xff09;是由尤雨溪&#xff08;Evan You&#xff09;创建并维护的一款开源前端开发框架。Vue以其轻量级、易上手和高度灵活的特点&…

IoTDB 入门教程③——基于Linux系统快速安装启动和上手

文章目录 一、前文二、下载三、解压四、上传五、启动六、执行七、停止八、参考 一、前文 IoTDB入门教程——导读 二、下载 下载二进制可运行程序&#xff1a;https://dlcdn.apache.org/iotdb/1.3.1/apache-iotdb-1.3.1-all-bin.zip 历史版本下载&#xff1a;https://archive.…