互联网入门-UEFI GPT和BIOS MBR的区别

 BIOS和UEFI(都是用来引导操作系统的固件)

BIOS是Basic Input Output System的简称。它是位于计算机主板上的芯片中的低级软件。计算机启动时,BIOS加载,BIOS负责唤醒计算机的硬件组件,确保它们正常运行,然后运行引导加载程序来引导Windows或任何其他已安装的操作系统。

EFI,是Extensible Firmware Interface的词头缩写,直译过来就是可扩展固件接口,它是用模块化、高级语言(主要是C语言)构建的一个小型化系统,EFI和BIOS一样,主要在启动过程中完成硬件初始化,但它是直接利用加载EFI驱动的方式,识别系统硬件并完成硬件初始化,彻底摒弃读各种中断执行。EFI驱动并不是直接面向CPU的代码,而是由EFI字节码编写成,EFI字节码是专用于EFI的虚拟机器指令,需要在EFI驱动运行环境DXE下解释运行,这样EFI既可以实现通配,又提供了良好的兼容。此外,EFI完全是32位或64位,摒弃16位实模式,在EFI中就可以实现处理器的最大寻址,因此可以在任何内存地址存放任何信息。

当EFI发展到1.1的时候,英特尔决定把EFI公之于众,于是后续的2.0吸引了众多公司加入,EFI也不再属于英特尔,而是属于了Unified EFI Form的国际组织,EFI在2.0后也遂改称为UEFI,UEFI,其中的EFI和原来是一个意思,U则是Unified(一元化、统一)的缩写,所以UEFI的意思就是“统一的可扩展固件接口”。

UEFI就是BIOS的升级版,它最显而易见的区别在于它把把BIOS单调的蓝底白字或黑底白字替换为图文并茂的样式,可以通过鼠标点击进行设置,反正看起来就是很高大上的样子了。

BIOS和UEFI都包含了硬件驱动,不然怎么识别显示器和磁盘呢?

BIOS支持 16位,32位,64位系统,对系统安装没有限制。

efi固件只要支持64位,就绝对不会支持32位。反之同理。

UEFI固件64位的话,以UEFI启动只能安装7/8/8.1/10的64位系统,Legacybios启动安装一般没系统限制。现在新出台式机、笔记本多数取用新型主板,支持UEFI启动+Legacybios启动,UEFI固件绝大部分是64位。而平板电脑绝大部分UEFI固件32位,而且不支持Legacybios启动,这些平板只能UEFI启动安装8/8.1/10的32位系统.

Legacybios 是UEFI 的一个CSM 功能,Compatibility Support Module (CSM) that provides legacy BIOS compatibility.

MBR和GPT(都是分区格式)

正常情况下:BIOS 只识别 MBR ,UEFI 只识别 GPT,但是UEFI 有CSM模式,可以识别MBR。至于BIOS 呢,可以通过一定技巧识别GPT

MBR只能支持4个主分区,再多就要用逻辑分区,而GPT则本身无限制,但受限于操作系统(Windows为128个);

MBR 与 GPT,都是分区格式,其中MBR最大分区小于等于2TB,而GPT分区没有2TB的限制,理论最大分区18 EB!GPT只能用在64位操作系统。Windows 10 64bit默认就是GPT。

MBR的硬盘最大支持2TB吗?不是说分区最大支持2TB嘛。MBR的4个主分区,加起来理论上应该可以支持8TB啊。【理论上可以实现接近4T,第一个分区2T不到点,第二个2T分区,因为有】https://superuser.com/questions/1393198/what-is-the-maximum-size-of-hard-drive-used-mbr-partitioning


MBR Sector 是什么

MBR Sector (Master Boot Record Sector) 是主引导记录扇区, 是硬盘上的第一个分区, 独立于其他文件系统。MBR 扇区 在磁盘上出现得比较多, 随着固件和硬件的发展, 将逐步被淘汰。

Master Boot Record Sector 是位于磁盘最前端的一段前导代码, 占一个扇区的空间大小, 因此被称为 MBR 扇区, 由于这一扇区承担有磁盘其他存储空间所不具备的特殊职能, 因此它独立于其他磁盘分区而存在。

  • 位置: 磁盘 0 扇区 至 1 扇区
  • 大小: 512Byte (1 扇区)
  • 独立性: 不属于任何一个操作系统, 独立于所有磁盘分区, 不受其他磁盘分区操作影响

MBR Sector 的作用

保存磁盘主分区信息于 MBR Sector 的磁盘分区表中, 保存操作系统启动引导分区信息于 MBR Sector 的主引导记录中, 引导 BIOS 将控制权交给系统启动引导程序;

MBR Sector 的结构

MBR Sector 主要由三个部分组成:

  • MBR 主引导记录, 保存操作系统启动引导信息
  • DPT 磁盘分区表, 记录磁盘的主分区信息
  • 结束标志, 值为 AA55 , 为 MBR sector 的结束标志

MBR 主引导记录

位置: 0000 – 01BD
大小: 446Byte

组成 位置 作用
Master Boot Record 0000 – 0088 引导代码, 引导从活动分区装载运行引导程序
出错信息数据区 0089 – 01BD 记录数据, 0089 – 00E1 为出错信息, 00E2 – 01BD 为 0 字节

DPT 磁盘分区表

位置: 01BE – 01FD
大小: 64Byte

磁盘分区表占 64Byte, 中存储了 4 个主分区的信息, 每个分区信息占 16Byte, 因此, 使用 MBR Sector 的磁盘最多拥有 4 个主分区, 为解决主分区数量被绝对限制住的问题, 可将 16Byte 的数据拿来指向一个分区空间, 再在这个空间中进行独立分区和记录, 这个空间便被成为拓展分区, 拓展分区里的分区被称为逻辑分区, Linux 文件系统中对硬盘设备的命名规则与此相关

Linux FHS 对于磁盘/硬盘设备的命名为: /dev/sd\[a-p]\[1-n]
sd 标识硬盘/磁盘设备文件,
a-p 代表 16块不同的硬盘, 从 a 开始分配,
1-4 代表主分区或者拓展分区, 5-n 代表拓展分区所指向的逻辑分区, 从 5 开始编号

DPT 结构信息

长度 意义
1 Byte Boot Signature, 00 代表非活动分区, 08 代表活动分区
1 Byte Start Head, 起始磁头
6 Bit Start Sector, 起始扇区
10Bit Start Cylinder, 起始柱面
1 Byte Partiton Signature, 分区类型
1 Byte End Head, 结束磁头
6 Bit End Sector, 结束扇区
10Bit End Cylinder, 结束柱面
4 Byte Sector Preceding Partiton, 起始扇区地址
4 Byte Sector in Partiton, 分区包含扇区数

结束标志

位置: 01FE – 01FF
大小: 2Byte

01FE 存储 55 标志, 为结束标志, 01FF 存储 AA 标志, 二者组合检验 MBR sector 是否有效。


参考:

https://blog.51cto.com/letitgo/1640956

https://zoharyips.github.io/2019/03/23/MBR/

字符编码-用Cheat Engine查看内存线性地址及系统内部编码

Windows操作系统,使用的编码是不是UTF-16

答案:应该是utf-16编码。

实验验证:

  • 新建一个txt文本文档,然后写一段英文字符 比如 helloword,默认保存方式是ANSI也就是常见的ASCII编码。
  • 保存完再重新打开该文档。接着打开Cheat Engine ,选择注入文本编辑器的进程,然后搜索hellword字符串,记得勾选utf-16,找到内存地址后,选择查看内存空间,记住该文本内容存放在内存中的地址是虚拟地址(也叫线性地址),且内存上存放文本内容采用的是utf-16 编码,不再是ANSI编码了。

 

字符编码-windows内部编码探讨用notepad++  查看十六进制代码如下:

字符编码-windows内部编码探讨

字符编码-windows内部编码探讨

字符编码-windows内部编码探讨

这里我们可以看到 hellword 字符串在内存中的虚拟地址(即线性地址)是000B386A


参考文章链接:https://social.microsoft.com/Forums/zh-TW/dc75573f-85c3-47a1-b761-97dda06ee847/windows2580520316319953247965292203512999230340325343072126159199?forum=windowsxpzhchs


windows操作系统区别于大多数其他操作系统的特点之一是,它的大多数内部文本串是以16位宽的Unicode字符来存储和处理的。Unicode(统一的字符编码标准)是一个国际字符集标准,它为世界上绝大多数一直的字符集定义了唯一的16位值(有关Unicode的更多信息,请参考www.unicode.org以及MSDN Library中有关的程序车技文档)
因为许多应用程序只处理8位(单字节)ANSI字符串,所以,接受字符串参数的windows的函数都有两个入口点:一个Unicode(宽字符,16位)和一个ANSI(窄字符,8位)。windows的以下几个版本,即windows95、windows98、windowsME,并没有为所有的windows函数实现Unicode的接口,所有如果所设计的应用程序要考虑到运行在这些操作系统之上,则往往使用窄字符版本。如果你调用一个windows函数的窄字符版本,则输入的字符串参数在被系统处理之前,先转成Unicode,而输出的参数则在被返回给应用程序之前,从Unicode转成ANSI字符串。因此,如果你有一个老的服务程序或者一段代码需要运行在windows上,而这份代码是按照ANSI字符串来编写的,那么windows将把ANSI字符转成Unicode,以便于内部使用。然而,windows永远不会转换文件内部的数据——由应用程序来决定是否要存储为Unicode或者ANIS。
在windows的以前版本中,亚洲和中东版本是美国和欧洲核心版本的一个超集,其中也包含了额外的windows函数,它可以满足处理更加复杂的文本输入和排版需求(比如从右至左的文本输入)。到了windows2000,所有语种的版本都包含同样的windows函数。windows不再使用单独的语言版本,而是有一份全球统一的二进制代码,因此,同一份安装可以支持多种语言(只需求加入各种语言包即可)。应用程序也可以利用这一套windows函数,做到同一份应用程序二进制代码可以支持多种语言!

互联网入门-KB / KiB,MB / MiB,GB / GiB区别

1KiB = 1,024Byte
1MiB = 1,024KiB
1GiB = 1,024MiB = 1,048,576 KiB
1TiB = 1,024GiB = 1,073,741,824 KiB

1KB = 1,000 Byte
1MB = 1,000 KB
1GB = 1,000,000 KB
1TB = 1,000,000,000 KB

  • 其中,KiB是kilo binary byte的缩写,指的是千位二进制字节
  • 而KB是kilobyte的缩写,指的是千字节
  • 说白了就是二进制与十进制的区别,也就是两种标准问题:国际单位制 SI 制定的十进制标准和 国际电工委员会 制定的二进制标准,也就是通常所说的SI和IEC标准。

众 所周知,在计算机中是采用二进制,在电脑世界里,以2的次方数为“批量”处理Byte会方便一些,整齐一些。每1024Byte为1KB,每1024KB为1MB,每1024MB为1GB,每1024GB为1TB。

而在国际单位制中TB、GB、MB、KB是“1000进制”的数,为此国际电工协会(IEC)拟定了”KiB”、“MiB”、“GiB”的二进制单位,专用来标示“1024进位”的数据大小;而硬盘厂商在计算容量方面是以每1000为一进制的,每1000字节为1KB,每1000KB为1MB,每1000MB为1GB,每1000GB为1TB,在操作系统中对容量的计算是以1024为进位的,并且并未改为”KiB”、“MiB”、“GiB”的二进制单位,这差异造成了硬盘容量“缩水”。买硬碟回家的时候是不是常常发现怎么买回去的容量,与真实可用的容量相差了一点点呢?

这是因为厂商、电脑使用的单位不同的缘故,500G硬碟厂商是使用1KB = 1,000 Byte 计算,但是到了电脑会变成 1KiB = 1,024Byte 计算。因此使用厂商的算法500GB = 500,000 MB,而到了电脑500,000 MB / 1024 MiB = 488.28125 GB。

来自:https://www.twblogs.net/a/5b8d73a02b717718833e15b6/zh-cn

互联网入门-shtml,html,xhtml,dtd,xsd,htm的含义与解析

一、Html与Xhtml 的区别与联系

XHTML1.0是“3种HTML 4文件根据XML 1.0标准重组”而成的,W3C推荐标准。

XHTML 1.0 Strict(严格版)是参照“HTML 4.01 Strict”改编,但不包括被弃用的元素。其文件类型描述为:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

XHTML 1.0 Transitional(过渡版)是参照“HTML 4.01 Transitional”改编,包括已于Strict版本被弃用的呈现性元素(例如<center><font>等)。其文件类型描述为:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

XHTML 1.0 Frameset(框架版)是参照“HTML 4.01 Frameset”改编,并允许于网页中定义框架元素。其文件类型描述为:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

xhtml1.0与html4.01的区别 https://www.w3.org/TR/2002/REC-xhtml1-20020801/#diffs

XHTML是XML的一种应用。基于这一事实,那些在以SGML为基础的HTML 4中,不完全合法的用法,应被改写。

文档应该是结构良好的

良好结构(Well-formed)[3]是由XML[4]引入的一个新概念。也就是说所有的元素都必须有结束标签或者以特殊的方式书写(如下所述),而且所有的标签必须合理地嵌套。

尽管如此,交叉使用在SGML中仍然是合法的,而且在现有的浏览器中也能够被广泛接受。

正确:元素嵌套

<p><em>这是一个要强调的段落。</em></p>
错误:元素交叉

<em><p>这是一个要强调的段落。</em></p>

元素名称和属性必须小写

XHTML文件要求所有的HTML元素名称和属性名称都要小写。因为XML本身大小写意义不同,因此必须区分开来。比如,<li><LI>是完全不同的。

要有结束标签

基于SGML的HTML 4里面,允许特定的标签省略结束标签;这些元素暗含有结束标记。XHTML不允许省略结束标记。所有元素(包括在DTD中声明为空的标签),都必须有结束标签。在DTD中声明为空的元素可以用结束标签或者使用空元素速记法(参见空元素)。

正确的:结束的元素

<p>這是一個段落。</p><p>這是另一個段落。</p>
錯誤的:没有结束的元素

<p>這是一個段落。<p>這是另一個段落。
等等等。。。直接看原文
HTML 4.01和XHTML 1.0之间的相似性导致许多网站和内容管理系统采用最初的W3C XHTML 1.0建议书。为了帮助作者过渡,W3C提供了有关如何以HTML兼容的方式发布XHTML 1.0文档的指导,并将它们提供给非XHTML设计的浏览器。

这种“HTML兼容”内容使用HTML媒体类型(text/html)而不是XHTML(application/xhtml+xml)的官方Internet媒体类型发送。

二、html与htm的区别

没有区别,但因DOS、Windows 95等早期系统采用的8.3命名规则只支持最长3字符的扩展名,为了兼容采用了htm,而linux或者ios都是支持多位扩展名的。

同理还有 jpg与jpeg 的区别。

三、shtml 与html的区别

本质上都属于静态网页一种,html属于纯静态,客户端浏览器读取html文件是什么就呈现给浏览者什么内容。而shtml则可以使用SSI。

SSI是为WEB服务器提供的一套命令,这些命令只要直接嵌入到HTML文档的注释内容之中即可。如:
<!–#include file=”info.htm”–>
就是一条SSI指令,其作用是将”info.htm”的内容拷贝到当前的页面中,当访问者来浏览时,会看到其它HTML文档一样显示info.htm其中的内容。

假如我们A页面是shtml的静态网页,而A页面里我们使用了include包含嵌入B静态html页面,如果你的服务器空间支持Shtml SSI这个时候我们,浏览器打开A页面时候,就会在A页面显示A原本内容以及B页面内容,我们查看网页源代码,不会发现B页面引入痕迹,而是看到B页面内容完全在A页面里。

假如:
1、A shtml页面里内容是:
我包含页面B:<!–#include file=”b.html”–>

2、B html网页内容:
我是B页面内容

3、这个时候浏览器查看A页面HTML源代码:
A shtml页面里内容是:我是B页面内容

这个就是shtml ssi 包含include魅力之处。

其它的SSI指令使用形式基本同刚才的举例差不多,可见SSI使用只是插入一点代码而已,使用形式非常简单。

当然,如果WEB服务器不支持SSI,它就会只不过将它当作注释信息,直接跳过其中的内容;浏览器也会忽略被包含信息,我们可以查看源代码看到include引入注解信息。

四、dtd的含义

经常能够看到dtd,那到底是什么意思呢?(ps,提前剧透一下,现在dtd已经被xsd取代了)

这首先要从xml,说起:下面举例的是早期2.3版本的web.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app id="WebApp_ID">
	<display-name>q</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>
</web-app>

第一行是 XML 声明。它定义 XML 的版本 (1.0) 和所使用的编码 (UTF-8)。

下面的是DOCTYPE声明。DOCTYPE是document type(文档类型)的简写,它规定了文档类型,文档类型遵循的协议名,以及文档类型协议的具体定义(也就是DTD,Document Type Definition)

在html中,我们也能看DOCTYPE,比如:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

说白了,dtd就是定义了文件中可以使用哪些标签,以及标签的用法。

所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:

  • 元素
  • 属性
  • 实体
  • PCDATA
  • CDATA

(DTD就是用来定义这些模块的),dtd教程参考http://www.w3school.com.cn/dtd/index.asp

五、xsd的含义

XML Schema 是基于 XML 的 DTD 替代者。
XML Schema 描述 XML 文档的结构。
XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD)。
参考教程http://www.w3school.com.cn/schema/index.asp

举个例子:3.1新版的web.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>o2o</display-name>

</web-app>

第一行,没有变化,第二行不再是DOCTYPE了。

先讲xmlns,这个是xml namespace 的含义,也就是 xml 命名空间。
我重新将web.xml的代码编排一下,便于理解。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 
id="WebApp_ID" version="3.1">
  <display-name>o2o</display-name>

</web-app>xmlns="http://xmlns.jcp.org/xml/ns/javaee"

首先xmlns="http://xmlns.jcp.org/xml/ns/javaee" 代表了整个web.xml的默认命名空间。
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  表示如果标签遇到xsi:xxx的,就以这个http://www.w3.org/2001/XMLSchema-instance命名空间为准。
xsi:schemaLocation 后面跟的是一些列键值对,记录的是 <命名空间,命名空间的定义>

下面是springmvc.xml的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
		http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">

。。。
</beans>

说明:上述例子中的命名空间xsi调用方法  xsi:schemaLocation或xsi:noNamespaceSchemaLocation 其实就是xsd中对命名空间调用方法进行设置。

这显然是逻辑自恰的,我们在xsd文件中,对命名空间调用一些方法进行设置。那么在xml文件中,自然就可以在命名空间中识别这些设置了。至于xml头中的xsi:schemaLocation,其实也是对命名空间xsi的设置。设置的目的就是将相应的命名空间和xsd文件进行键值对关联。至于xsi的命名空间,因为在本xml文件中,没有用到该命名空间,所以xsi是炮灰,纯粹就是为了让别的命名空间和xsd进行关联。

参考

https://www.w3.org/TR/xmlschema-1/#Instance_Document_Constructions

https://stackoverflow.com/questions/34202967/xmlns-xmlnsxsi-xsischemalocation-and-targetnamespace

 

 

http协议-html与http的区别

大白话:html协议是  保存信息的  文档协议,http协议 是 传输信息的 传输协议。

在Web服务中,信息一般是使用HTML格式以超文本和超媒体方式传送的,所使用的Internet协议是HTTP协议。

HTTP  意为超文本传输协议(全称是Hypertext Transfer Protocol)。是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示等(如文本先于图形显示)。这就是我们为什么在浏览器中看到的网址都是以“http://”开头的原因。

HTML  释为超文本标记语言(全称是Hypertext Markup Language),是用于WWW上文档的格式化语言。使用HTML语言可以创建文本文档,该文档可以从一个平台移植到另一个平台。HTML文件是带有嵌入代码(由标记表示)的ASCII文本文件,它用来表示格式化和超文本链接。HTML文件的内容通过一个页面展示出来,不同页面通过超链接关联起来。

 

网络原理-计算机网络详解-各类包长度及抓包分析

大白话:局域网 mtu 1500;Internet  mtu 576

对于UDP协议来说,整个包的最大长度为65535,其中包头长度是20字节(包括了伪首部:这个伪首部其实是属于ip头部的部分,里面有源ip地址和目标ip地址)所以UDP实际可用携带的最大数据是:65515字节长度。【udp协议里面:长度占了2个字节,16位。能够表示的范围是2^16-1 即 0-65515】

去除20字节的IP首部和8个字节的UDP首部,UDP数据报中用户数据的最长长度为65507字节。但是,大多数实现所提供的长度比这个最大值小。
我们将遇到两个限制因素。第一,应用程序可能会受到其程序接口的限制。socket API提供了一个可供应用程序调用的函数,以设置接收和发送缓存的长度。对于UDP socket,这个长度与应用程序可以读写的最大UDP数据报的长度直接相关。现在的大部分系统都默认提供了可读写大于8192字节的UDP数据报(使用这个默认值是因为8192是NFS读写用户数据数的默认值)。
第二个限制来自于TCP/IP的内核实现。可能存在一些实现特性(或差错),使IP数据报长度小于65535字节。
在SunOS 4.1.3下使用环回接口的最大IP数据报长度是32767字节。比它大的值都会发生差错。
但是从BSD/386到SunOS 4.1.3的情况下,Sun所能接收到最大IP数据报长度为32786字节(即32758字节用户数据)。
在Solaris 2.2下使用环回接口,最大可收发IP数据报长度为65535字节。
从Solaris 2.2到AIX 3.2.2,发送的最大IP数据报长度可以是65535字节。很显然,这个限制与源端和目的端的实现有关。
主机必须能够接收最短为576字节的IP数据报。在许多UDP应用程序的设计中,其应用程序数据被限制成512字节或更小,因此比这个限制值小。

由于IP能够发送或接收特定长度的数据报并不意味着接收应用程序可以读取该长度的数据。因此,UDP编程接口允许应用程序指定每次返回的最大字节数。如果接收到的数据报长度大于应用程序所能处理的长度,那么会发生什么情况呢?不幸的是,该问题的答案取决于编程接口和实现。
典型的Berkeley版socket API对数据报进行截断,并丢弃任何多余的数据。应用程序何时能够知道,则与版本有关(4.3BSD Reno及其后的版本可以通知应用程序数据报被截断)。
SVR4 下的socket API(包括Solaris 2.x) 并不截断数据报。超出部分数据在后面的读取中返回。它也不通知应用程序从单个UDP数据报中多次进行读取操作。TLI API不丢弃数据。相反,它返回一个标志表明可以获得更多的数据,而应用程序后面的读操作将返回数据报的其余部分。在讨论TCP时,我们发现它为应用程序提供连续的字节流,而没有任何信息边界。TCP以应用程序读操作时所要求的长度来传送数据,因此,在这个接口下,不会发生数据丢失。

对于TCP协议来说,整个包的最大长度是由最大传输大小(MSS,Maxitum Segment Size)决定,MSS就是TCP数据包每次能够传 输的最大数据分段。为了达到最佳的传输效能TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以往往MSS为1460。通讯双方会根据双方提供的MSS值得最小值 ,确定为这次连接的最大MSS值。

IP层:
对于IP协议来说,IP包的大小由MTU决定(IP数据包长度就是MTU-28(包头长度)。 MTU值越大,封包就越大,理论上可增加传送速率,但 MTU值又不能设得太大,因为封包太大,传送时出现错误的机会大增。

UDP 包的大小就应该是 1500 – IP头(20) – UDP头(8) = 1472(BYTES)
TCP 包的大小就应该是 1500 – IP头(20) – TCP头(20) = 1460 (BYTES)

当我们发送的UDP数据大于1472的时候会怎样呢?这也就是说IP数据报大于1500字节,大于 MTU.这个时候发送方IP层就需要分片(fragmentation).把数据报分成若干片,使每一片都小于MTU.而接收方IP层则需要进行数据报的重组.这样就会多做许多事情,而更严重的是,由于UDP的特性,当某一片数据传送中丢失时,接收方便无法重组数据报.将导致丢弃整个UDP数据报。
因此,在普通的局域网环境下,我建议将UDP的数据控制在1472字节以下为好.
进行Internet编程时则不同,因为Internet上的路由器可能会将MTU设为不同的值.如果我们假定MTU为1500来发送数据的,而途经的某个网络的MTU值小于1500字节,那么系统将会使用一系列的机制来调整MTU值,使数据报能够顺利到达目的地,这样就会做许多不必要的操作.

一般默认的设置,PPPoE连接的最高MTU值是1492, 而以太网 (Ethernet)的最高MTU值则是1500,而在Internet上,默认的MTU大小是576字节。

鉴于 Internet上的标准MTU值为576字节,所以我建议在进行Internet的UDP编程时.最好将UDP的数据长度控件在548字节 (576-8-20)以内.


许多服务器将最大的UDP数据包限制为512字节(如dns)

IPv4 最小重组缓冲区大小是576,IPv6在1500处。从这里减去标头大小。请参阅W. Richard Stevens的UNIX网络编程

576字节是最小的缓冲区大小,即每个实现必须能够重组至少那个大小的分组。有关详细信息,请参阅IETF RFC 1122

安全UDP的有效载荷最大是508字节。这是一个数据包大小为576,减去最多60个字节的IP标头和8个字节的UDP标头。任何这个规模或更小的UDP有效载荷都保证可以通过IP交付(尽管不能保证完整的交付)。由于其他原因,在路由的过程中可能会丢失。除了仅IPv6路由,最大有效载荷为1,212字节。正如其他人所提到的,在某些情况下可以添加额外的协议头。取而代之的是300-400字节的存储空间。

任何UDP数据包都可能被分割。这并不重要,因为丢失一个数据包与丢失一个未分组的数据包具有相同的效果:使用UDP,整个分组被丢弃的这种种情况是可能发生的。

一个典型 IPv4报头为20个字节,和UDP头部为8个字节。但是又包含IP选项,这可以将IP报头的大小增加到60个字节。另外,有时中间节点需要将数据报封装在另一个协议中,如IPsec(用于VPN等),以便将数据包路由到目的地。因此,如果你不知道MTU特定网络路径的话,最好为其他标题信息留下合理的存储空间,可能这些信息并不是你预期的。通常认为UDP的有效载荷是512字节,即使这样处理也不能为最大尺寸的IP标头留下足够的存储空间。


抓包实测 – UDP/TCP数据包分析

经测试,局域网环境下,UDP包大小为1024*8,速度达到2M/s,丢包情况理想.
外网环境下,UDP包大小为548,速度理想,丢包情况理想.

本文旨在分析使用抓包工具抓取到的数据包。

(一)抓包工具

tcpdump:linux下的抓包利器

wireshark:带GUI的抓包工具,其前身是大名鼎鼎的Ethereal

(二)抓包

这里只简述tcpdump的一般用法,详细资料可参考tcpdump使用手册。

wireshark带有GUI,操作比较简单,暂不赘述。

tcpdump -i eth1 tcp -Xnlps0 port 16815 src host 192.168.0.0 and dst net 192.168.0.1
tcpdump -i eth1 -Xnlps0 dst net 172.23.9.155 and port 37861
tcpdump -i eth1 -Xnlps0 dst net 172.23.9.155 and port 37861 -w yourfile

PS:可以使用wireshark分析tcpdump抓取的数据包

tcpdump -w output.cap -s0

wireshark可以在图形界面下分析应用层按照TCP/IP四层结构显显示数据包,
第一行是数据链路层的信息,
第二行是网络层信息(IP协议),
第三行是传输层信息(TCP协议),
第四行是应用层信息(HTTP协议),
可以展开每一行用来观察具体的内容

(三)TCP/UDP数据包结构

抓包分析,装载udp的ip包和装载tcp的ip包,查明ip包首部都没有添加可选项。

PS:后面的数据分析都是带IP头的数据包。

(四)UDP数据包分析

0x0000:  4500 0054 9a08 4000 4011 b88d ac17 8639  E..T..@.@……9
0x0010:  ac17 099b e317 93e5 0040 e854 0000 0065  ………@.T…e
0x0020:  012d d668 0000 0000 0000 0000 0000 0038  .-.h………..8
0x0030:  3030 3030 3030 3030 3030 3030 3030 3030  0000000000000000
0x0040:  0000 0001 0000 0000 0000 0000 0000 0000  …………….
0x0050:  0000 0000

4500        [4: ipv4], [5: header length, *4 ==> 20], [00: Type of Service(TOS)]
0054        [total length: 0x54(84), ip header(20) + udp header(8) + packlen(56) -> 84]
9a08        id
4000        3bits(ip flags), 40 -> do not flag, 5bits: fragment offset
4011        [ttl: 40], [protocol: 0x11(17) ==> udp]
b88d        checksum
ac17 8639   source ip: 172.23.134.57

ac17 099b   dest ip: 172.23.9.155
e317        sourc port: 58135 (ntohs(0xe317)) [exchange]
93e5        dest port: 37861
0040        length: 64
e854        checksum

0000 0065…  data

 

(五)TCP数据包分析

0x0000:  4500 0073 cdc5 4000 4006 6285 ca6e 4099  E..s..@[email protected]@.
0x0010:  7474 8abe 1f40 070a 6d88 acdd 23d7 a448  tt…@..m…#..H
0x0020:  5018 16d0 0aa0 0000 0100 8000 0000 0047  P…………..G
0x0030:  3004 8000 0016 8117 04d7 cd00 000b 0006  0……………
0x0040:  4500 1a4d 6bd0 180a 909a bc08 883d edea  E..Mk……..=..
0x0050:  091f                                     ..

4500        [4: ipv4] [5: ip header length, 4*5 -> 20] [00 TOS]
0073        [total length: 0x73(115), ip header(20) + tcp header(20) + packlen(75) -> 115]
cdc5        id(ignore it)
4000        3bits(ip flags), 40 -> do not flag, 5bits: fragment offset
4006        [40 ttl] [06 protocol, 0x06 -> tcp]
6285        checksum
ca6e 4099   source ip: 202.110.64.153

7474 8abe   dest ip: 116.116.138.190
1f40        sourc port: 8000 (ntohs(0x401f)) [exchange]
070a        dest port: 1802
6d88 acdd   32 bits sequence number(ignore)
23d7 a448   32 bits ack(ignore)

5018        [5: tcp header length 5 * 4 -> 20] [018: 0000 00/01 1000: reserved 6bit -> ACK+PUSH] (URG|ACK|PSH|RST|SYN|FIN)
16d0        16bit window size: 5840
0aa0        16bit tcp checksum(ignore)
0000        16bit urgent pointer
———————

抓包工具:科来网络分析系统

https://blog.csdn.net/cybertan/article/details/5961049

参考:

https://blog.csdn.net/wirror800/article/details/6977421

https://blog.csdn.net/buptzwp/article/details/5055487

网络原理-计算机网络详解-网线传递数字信号的原理

家用的网线:传递的数字信号,原理是:

(1)和电线传输电的原理一样,只不过网线上传输的就是脉冲电信号,而且遵守一定的电器规则。
(2)计算机上的数据都是用0和1来保存的,所以在网线上传输时就要用一个电压表示数据0,用另一个电压表示数据1。
(3)网线上传输的是数字信号。
(4)网线在传输数据就是传输电信号,就会有电流通过,那么就会产生电磁场,几根线之间的电磁场就会互相干扰,会影响电压,使得数据失真,所以把绞在一起就可以有效的抵消掉这种线之间的互相电磁干扰。

总结来说:网线就是传递的脉冲电信号,在一个脉冲中,即有电压变化,又有电流变化。
网线传输信号是数字信号,方波,相当脆弱,容易受到周边磁场和自身的干挠。所以双绞的原理就是为了尽可能的消除其干挠。
我们日常使用最多的网线就是双绞线,但网线不能过长,电脑能识别的语言就只有0和1,网络得传输信号就是0和1。这些信号通过网线的时候变成了电流,而网线的电流强度是-15v和+15v之间,电流通过网线传输的时候会有电阻。所以,根据高压输电原理,线路越长,就要用越大的电压等级来输电。如果网线过长,但是这么低的电压,就会导致信号减弱,直至丢失。因此网线不宜过长,一般来说,网线超过一百米,另一头就接收不到信号了。

rj45网线中,单方向传输信号都是一对导线,里面用的是差分信号,传递给对方的是电压变化 信号。【双绞线 可以 屏蔽 外界的 电磁干扰,抗干扰强】

如果差分信号电路中的源和接收器阻抗相等,则外部电磁干扰往往会同样影响两个导体。由于接收电路仅检测导线之间的差异,因此与具有未配对参考(接地)的一个导体相比,该技术抵抗电磁噪声。该技术适用于模拟信号,如平衡音频和数字信号,如RS-422,RS-485,双绞线以太网,PCI Express,DisplayPort,HDMI和USB。【来自维基百科】

数字电路:从 单端信号 发展到 差分信号

单端信号与同轴电缆一起使用,其中一根导线完全屏蔽另一根导线与环境。所有屏幕(或屏蔽)都组合成一块材料,形成一个共同的地面。差分信号与平衡的导体对一起使用。对于短电缆和低频,这两种方法是等效的,因此具有公共接地的廉价单端电路可以与廉价电缆一起使用。

单端信号
早期的数字总线大部分使用单端信号做信号传输,如TTL/CMOS信号都是单端信号。所谓单端信号,是指用一根信号线的高低电平的变化来进行0、1信息的传输,这个电平的高低变化是相对于其公共的参考地平面的。单端信号由于结构简单,可以用简单的晶体管电路实现,而且集成度高、功耗低,因此在数字电路中得到最广泛的应用。

大白话:单端信号 用一根线 接地,另一根 传递 电压 高低变化,当然也是 单方向 传输啦。

======================================================

差分传输是一种信号传输的技术,区别于传统的一根信号线一根地线的做法,差分传输在这两根线上都传输信号,这两个信号的振幅相同,相位相反。在这两根线上的传输的信号就是差分信号。信号接收端比较这两个电压的差值来判断发送端发送的逻辑状态。在电路板上,差分走线必须是等长、等宽、紧密靠近、且在同一层面的两根线。

差分信号是用一个数值来表示两个物理量之间的差异。差分信号又称差模信号,是相对共模信号而言的。


网线传输原理

一般情况下,网络从上至下分为五层:应用层、传输层、网络层、数据链路层、物理层。每一层都有各自需要遵守的规则,称之为“协议”。TCP/IP协议就是一组最常用的网络协议。
网线在网络中属于物理层,计算机中所需要传输的数据根据这些协议被分解成一个一个数据包(其中包括本地机和目的机的地址)后,按照一定的原则最后通过网线传输给目的机。通俗讲,和我们去寄信的道理一样,先写好信的内容(计算机上的数据)、装信封然后在封面上写地址(打包成数据包,里面包含本地机和目的机的地址)、寄出(传输),那么网线就相当于你的地址和你要寄到的地址之间的路。
(1)如上所述,和电线传输电的原理一样,只不过网线上传输的就是脉冲电信号,而且遵守一定的电气规则。
(2)计算机上的数据都是用0和1来保存的,所以在网线上传输时就要用一个电压表示数据0,用另一个电压表示数据1。
(3)网线上传输的是数字信号
(4)网线在传输数据就是传输电信号,就会有电流通过,那么就会产生电磁场,几根线之间的电磁场就会互相干扰,会影响电压,使得数据失真,所以把绞在一起就可以有效的抵消掉这种线之间的互相电磁干扰。
网线传输信号是数字信号,方波,相当脆弱,容易受到周边磁场和自身的干挠。所以双绞的原理就是为了尽可能的消除其干挠。
明白了网线所接的水晶头:rj45接口原理就自然明白了网线的原理:
RJ-45各脚功能(10BaseT/100BaseTX):
1、传输数据正极   Tx+
2、传输数据负极   Tx-
3、接收数据正极   Rx+
4、备用(当1236出现故障时,自动切入使用状态)
5、备用(当1236出现故障时,自动切入使用状态)
6、接收数据负极   Rx-
7、备用(当1236出现故障时,自动切入使用状态)
8、备用(当1236出现故障时,自动切入使用状态)
网线中传输的是数字信号,网卡工作在物理层,是将数据根据OSI的七层协议,从要传输的数据一级一级的转换成帧数据,用电信号的方式传输出去,接收方依同样的原理,转换成对方的原始数据。
RJ-45的接头实现了网卡和网线的连接。它里面有8个铜片可以和网线中的4对双绞(8根)线对应连接。其中100M的网络中1、2是传送数据的,3、6是接收数据的。1、2之间是一对差分信号,也就是说它们的波形一样,但是相位相差180度,同一时刻的电压幅度互为正负。这样的信号可以传递的更远,抗干扰能力强。同样的,3、6也一样是差分信号。
网线中的8根线,每两根扭在一起成为一对。我们制作网线的时候,一定要注意要让1、2在其中的一对,3、6在一对。否则长距离情况下使用这根网线的时候会导致无法连接或连接很不稳定。
首先说一下差分方式传输。所谓差分方式传输,就是发送端在两条信号线上传输幅值相等相位相反的电信号,接收端对接受的两条线信号作减法运算,这样获得幅值翻倍的信号。其抗干扰的原理是:假如两条信号线都受到了同样(同相、等幅)的干扰信号,由于接受端对接受的两条线的信号作减法运算,因此干扰信号被 基本抵消,那么怎样才能保证两条信号线受到的干扰信号尽量是同相、等幅的呢?办法之一那就要将两根线扭在一起,按照电磁学的原理分析出:可以近似地认为两条信号线受到的干扰信号是同相、等幅的。 两条线交在一起后,既会抵抗外界的干扰也会防止自己去干扰别人。一般常用的就是双绞线。
大多数局域网使用非屏蔽双绞线(UTP—Unshielded Twisted Pair)作为布线的传输介质来组网,网线由一定距离长的双绞线与RJ45头组成。双绞线由8根不同颜色的线分成4对绞合在一起,成队扭绞的作用是尽可能减少电磁辐射与外部电磁干扰的影响,双绞线可按其是否外加金属网丝套的屏蔽层而区分为屏蔽双绞线(STP)和非屏蔽双绞线(UTP)。在EIA/TIA-568A标准中,将双绞线按电气特性区分有:三类、四类、五类线。网络中最常用的是三类线和五类线,超五类,目前已有六类以上线。第三类双绞线在LAN中常用作为10Mbps以太网的数据与话音传输,符合IEEE802.3 10Base-T的标准。第五类双绞线目前占有最大的LAN市场,最高速率可达100Mbps,符合IEEE802.3 100Base-T的标准。做好的网线要将RJ45水晶头接入网卡或HUB等网络设备的RJ45插座内。相应地RJ45插头座也区分为三类或五类电气特性。RJ45水晶头由金属片和塑料构成,特别需要注意的是引脚序号,当金属片面对我们的时候从左至右引脚序号是1-8, 这序号做网络联线时非常重要,不能搞错。双绞线的最大传输距离为100米。 EIA/TIA的布线标准中规定了两种双绞线的线序568B与568A。
标准568B:橙白–1,橙–2,绿白–3,蓝–4,蓝白–5,绿–6,棕白–7,棕–8
标准568A:绿白–1,绿–2,橙白–3,蓝–4,蓝白–5,橙–6,棕白–7,棕–8
568A和568B两者有何区别呢?后者是前者的升级和完善,但是后者还处于草案阶段,包含永久链路的定义和六类标准。另外在综合布线的施工中,有着568A和568B两种不同的打线方式,两种方式对性能没有影响,但是必须强调的是在一个工程中只能使用一种打线方式。
至于5类和超5类的不同主要是应用的不同。5类系统在使用过程中只是使用其中的两对线缆,采用的是半双工,而超5类为了满足千兆以太网的应用,采用四对全双工传输。因而远端串扰(FEXT),回波损耗(RL)、综合近端串扰(PSNEXT)、综合ACR和传输延迟也成为必须考虑的参数。所以超5类比5类有着更高的性能要求。6类和5类实质的区别在于它们的带宽不同,5类只有100MHz,六类是250MHz。它们支持的应用也因为性能的不同而不同,6类支持更高级别的应用。在性能上6类也比5类有更高的要求,为了提高性能,在结构上6类比5类也要复杂一些RJ45接头的8个接脚的识别方法是,铜接点朝自己,头朝右,从上往下数,分别是1、2、3、4、5、6、7、8。
在整个网络布线中应用一种布线方式,但两端都有RJ-45 的网络联线无论是采用568A,还是568B, 在网络中都是通用的。规定双工方式下本地的1、2两脚为信号发送端,3、6两脚为信号接收端,所以讲,这两对信号必须分别使用一对双绞线进行信号传输。在做线时要特别注意。现在100M网一般使用568B方式,1、2两脚使用橙色的那对线,其中白橙线接1脚;3、6两脚使用绿色的那对线,其中白绿线接3脚,绿线接6脚,剩下的两对线在10M、100M快速以太网中一般不用,通常将两个接头的4、5和7、8两接头分别使用 一对双绞线直连,4、5用蓝色的那对线,4为蓝色,5为白蓝色;7、8用棕色的那对线,7为白棕色、8为棕色。如果网线两头都按一种方式这么做的话就叫做直连缆方式或直通线方式。
如果网线的两头不按一种方式,一头是568B,另一头是568A,那么这种做法叫交*缆,其实就是只须将其中一个 头在568B的基础上1、2和3、6对调一下就行。不同的做法用在不同的环境,后面会讨论。
很多人以为做直连缆时将线排成,这是错误的。这既不是568A也不是568B。这种做法3、6信号线未绞在一起,失去了双绞线的屏蔽作用。虽然在传输距离近时能正常使用不容易被发现,当传输距离远时会出现丢包,或者导致局域网速度慢,很多人会怀疑网卡质量和网线质量,往往不会想到是线做的有问题。
当网线作为局域网线路时,电压不超过3伏
作为电话线路时,电话在待机状态(即没拿起来时)供电电压为-48V(反向电位) 当电话被打通需要震铃时,供电电压为+48V(正向电位)并且叠加24V 25HZ交流,使其成为72V交流25HZ震荡信号。这样就会震铃了。 当拿起电话后(无论是对方打来还是你自己拿起)电压从-48V下降并转换为+8—+18V(这个由你线路距离局端设备远近而不同) 电话是以恒流方式供电。也就是,电流一定,功率越大,电压越高。并且除了震铃之外,其他的全部为直流送电,包括脉冲直流 并且,如果是之后新装的线路中,大多地区已经使用数字模拟混合接入,即若你的电话为06年之后购买并符合标准的,则为数字信号,用载波模式装载到线路中传输,若为之前的或者局端设备还没有更新,那么则是模拟信号,用电流高低震荡的方式传送。
作为电口出来的网线时,网线供电器的输出电压一般是24V或者48V,INTEL的设备就是24V,CISCO和神脑的设备就是48V,这样经过100米的网线传输后,电压还是足够的,而这些网络设备内部还有一个转换电路,将这些可能高于要求的电压降到正常范围内。
数字信号从Internet上下载下来,通过ISP接入你所在区域的交换机,通过D/A变换变成模拟信号,经过4线至2线的变换后,传到你的调制解调器,再经过一次A/D变换,还原成计算机可接受的数字信号。


无线网快还是插网线快?

同一个路由器下,绝大多数情况下,网线比无线网快。

不敢说绝了,因为上网情况不太,实际上网速度也有略有影响。

正常来说,插网线的网络损耗比较少,在局域网中常见的网线主要有双绞线、同轴电缆、光缆三种。 双绞线,是由许多对线组成的数据传输线。它的特点就是价格便宜,所以被广泛应用,如我们常见的电话线等。它是用来和RJ45水晶头相连的。

我们日常使用最多的网线就是双绞线,但网线不能过长,电脑能识别的语言就只有0和1,网络得传输信号就是0和1。这些信号通过网线的时候变成了电流,而网线的电流强度是-15v和+15v之间,电流通过网线传输的时候会有电阻。所以,根据高压输电原理,线路越长,就要用越大的电压等级来输电。如果网线过长,但是这么低的电压,就会导致信号减弱,直至丢失。因此网线不宜过长,一般来说,网线超过一百米,另一头就接收不到信号了。

而我们正常使用网线的一般只有几米,损耗是非常少的。

无线网络损耗比较大的原因比较多,如建筑物对网络的损耗,特别是建筑物中的承重墙对网络损耗会比较大。由于wifi信号有特定的信道,这些信道就如同告诉公路,如果附件多个路由器发射出来的wifi都在一个信道传输,也会导致网络变慢。

在家中使用PC用网线连接路由器比wifi连接网速还是要更好的。

其实路由器端是没有太大问题的,虽然标称300m的2.4gWIFI有大半虚标,但实际值还是比有线的100m快的。但是问题就在于你的笔记本电脑,手机和便宜的无线网卡速率都是54m!

这就产生瓶颈制约,路由器标称给你6碗饭,实际给你3碗饭,但你只吃得下1碗!

现在的电脑配置也有问题,机械硬盘标称和测速都显示130m/s以上,但实际上使用起来持续速度只有40m/s左右,因为机械盘早期写入的是缓存,缓存再写入碟片,但测速软件测的是写入缓存的速度而非写入盘片的速度。测速450m/s的ssd真实持续写入速度其实也就95m/s。

40m/s换算为速率就是480mbps,所以,你的电脑根本上来说就只能用480m的网速,什么千兆网卡都是噱头,因为根本没这能力跑!ssd会好一些,但是也只能勉强跑满千兆!

千兆有线的设备成本比较低,而你如果想用千兆WIFI,光路由器和接收器的投资就不低于2500元,而且还要专用,不能通用。

总之,这是这个时代的科技局限,你手机无线接收模块就只54mbps,速度上限就7m/s,5g的会好点,但也只能到15m/s左右的上限。你用再好的路由器都没用!

包括现在的小米用了黑科技双WIFI,但也只能增加WIFI信号强度而不能增加速度。

总结:现在普遍使用百兆有线的情况下,有线是要比无线快的,想要无线比有线快,要等高标准的WIFI接收模块普及了才行。

首先有两个概念。

我们常说的网速:“XX兆光纤”,对应到一个专业词汇叫“网络带宽”。指的是单位时间的传输效率,一般运营商给的这个值是理论最大值。实际情况往往到不了这个大小。一个比较好的类比是,带宽越大,就好像一个高速公路修得越宽,车道越多。
第二个生活化的词汇是“网好卡”,对应到专业词汇叫“网络延迟”,延迟有很多部分组成,也受很多因素影响。但最终用户感受到的是一个网络请求从开始到收到结果的时间间隔。可以类比为高速公路上的车跑的快慢。
所以上面我们可以看出,网络“卡不卡”是有两个指标衡量的,在不同的使用场景下时有不同的判断依据的。

下面举例两个场景。

用手机或者电脑打游戏的时候,往往游戏需要发生的网络请求很频繁但是数据量并不大。这个时候我们需要网络延迟很低,但是并不需要有很大的网络带宽。所以我们经常能看到,隔壁老王家10兆的网络比你家100兆的网络打游戏更加顺畅。类比到高速公路上,就是相当于有很多赛车一辆接一辆在两个地方往返,这个时候路面是不是很宽其实大家不太在乎,在乎的是“路好不好走”,也就是延迟是不是很低。
在线观看视频或者下载资料的时候,电脑会从网络上不断的下载信息,放到本地,供我们观看。这些信息相对是非常大的,这时候我们就需要很宽的公路去运送这些资源到本地来,路面稍微难走一点也没有关系。这个场景下我们需求的是大的带宽,对延时没有太高的要求。
说完了啥叫网络卡,以及不同场景下的不同需求,我们来看一看有线连接和无线连接的区别。(这只讨论家用路由器和日常使用设备之间的连接形式)。

顾名思义有线连接就是信息由路由器到主机之间用光缆连接以传输信息,信息传输过程是先将电信号转化为光信号在光缆中传输,然后另一端接收到结果后再由光信号转换为电信号。完成传输。在光缆内传输的好处是,受到外界干扰很小,而且本身带宽也足够大(现在市面上光缆的传输带宽都是远大于我们家用网络带宽的)。
而无线连接则是,路由器和主机之间,将电信号通过调制解调器转换,以电磁波为载体在端与端之间传输。优势在于方便。但是劣势也很明显,例如电磁波比较容易受到干扰,传输带宽和发射功率有关,以及多个无线网信道之间相互干扰等等
所以从理论上看,相应其他条件下,有线连接会比无线连接在网络带宽和网络延时上都更具有优势一些。

至于其他答案中提到的2.4G和5G标准相关的内容,其实都是这个标准下用了全新不易冲突的电磁波频段以及新的硬件标准使得相同功率下传输效率更高。但是现阶段而言,不太可能突破有线连接的速度。

再顺便提及一下某些朋友可能的疑虑,电脑接有线,手机用无线,体验上手机比电脑更加流畅。这个问题其实很简单,做对比要控制好变量,很可能体验上的差别是由其他东西导致的。比如运营商在晚高峰的时候承诺的带宽达不到,或者晚高峰网络拥塞整体延时都增加了等等。

你们见过数据中心用无线传业务数据吗?!

1.无线工作方式为半双工,类似于以前那种很老的hub(冲突检测,载波侦听,就是我在用的时候你就得等着我把数据传完你再传)。

2.无线的吞吐看起来参数比千兆有线还高(1200Mbps甚至5300Mbps),但他的工作方式决定了它在多用户的环境下性能损失非常大,特别是多用户大吞吐的时候,抖动增大和速率下降都会非常利害,信号也容易受到干扰还不安全。

3.现在高端一点的无线路由器在硬件层面有mimo数据流的多入多出,链路聚合,专用无线处理芯片等技术,但其实性能提升也有限,原因还是看第一点他的工作原理决定的。软件层面会有一些专业的商业公司出的专用操作系统比如aruba,Cisco,huawei等,但也只是在稳定性,安全性和部署维护上进行了优化。

4.有线的路由器或者交换机会有专门的处理芯片来处理三层的路由数据和二层的交换数据,一般都能达到线速转发。比如48口的交换机背板宽带宽228Gbps,实际上只要用到96Gbps就足够让这48台终端同时上下行并发吞吐数据了,而且延时抖动和速率下降并不明显,如果是无线分分钟死给你看。但是呢即使是dlink tplink fast 腾达之流,瞎标参数,千兆有线也比大牌的千兆无线快和稳定,但不用说那种专业厂商的设备。

个人经验,高端点的ac无线路由器单纯的作为接入点30人左右的接入会有比较好的用户体验,尽管他可能支持128或者更高的接入,但能连接和可以用可是二码事。一分钱一分货,那种几十块的就不用说了,家庭3到5个人,要求不高,也能用。

所以,至少一段时间来看无线都只是作为接入层的扩展设备而存在,因为他不用布线方便啊

参考链接:

https://www.bilibili.com/read/cv1166002/

https://www.diangon.com/thread-17307-1-1.html

字符编码-url编码介绍

摘要:url编码(百分号编码)是对字节流编码的,而网页信息编码成字节流有很多种编码方式,我们探讨的是浏览器、JavaScript及服务器在不同情况下,会将网页信息如何编码成字节流。

从目前的http抓包来看,网页发送的请求最终都是ASCII编码的二进制数据流,ASCII解码数据流时,我们能看到请求行,请求头和请求体。

目前的浏览器中,http请求头中 已经不存在  Accept-Charset 字段了。

Accept-Charset:GB2312,utf-8;q=0.7,*;q=0.7

post提交表单时:下面的 charset=utf-8 字段 ,现在的浏览器已经没这个字段了。
也就是说:http请求体中的编码方式不指定,但浏览器会根据网页编码情况和表单编码的设置,对请求体【也就是post提交的表单数据】进行编码。服务器解析时,就默认这个是由本网站的网页提交的,解码时就采用本网站事先规定好的编码方式。

Content-Type: application/x-www-form-urlencoded;charset=utf-8

 

一、url与uri的区别

URI:统一资源标志符URI,就是在某一规则下能把一个资源独一无二地标识出来。
URL:统一资源定位符URL,就是用定位的方式实现的URI。
URN:统一资源命名符URN,就是用独一无二的名字来实现URI。

大白话:URI 包括了 URL 和 URN。【URL和URN采用不同的方式来标识资源】
当然因为协议的要求,如JAVA 的URI转换中,不希望出现”[“和”]”。当然有些URL中可能出现 “[“或”]”,这个东西不符合 URI。所以 不能说 全部的URL 都是 URI。

二、url格式

通常而言,我们所熟悉的 URL 的常见定义格式为:
scheme://host[:port#]/path/…/[url-params][?query-string][#anchor]

scheme //有我们很熟悉的http、https、ftp以及著名的ed2k,迅雷的thunder等。
host   //HTTP服务器的IP地址或者域名
port#  //HTTP服务器的默认端口是80,这种情况下端口号可以省略。如果使用了别的端口,必须指明,例如tomcat的默认端口是8080 http://localhost:8080/
path   //访问资源的路径
url-params  //所带参数
query-string    //发送给http服务器的数据
anchor //锚点定位  就是文章里面的标题,浏览器可以直接跳到具体的标题那节

三、url编码规范史

url的目的就是定位资源,而url编码 的目的就是  为了 创建 url。url编码里面有保留字,就是为了对url里面的冲突内容 进行转义。

核心总结:

以前的url编码,默认字节流是 ASCII编码。url解码字节流后再用ASCII码解码就能知道原来的信息。后来因为各国的文字编码不同,如果用不同的文字编码生成字节流然后url编码,当url解码后不知道用哪种方式解码了。

所以,后来决定 RFC 3986,建议所有新的URI必须对未保留字符不加以百分号编码;其它字符建议先转换为UTF-8字节序列, 然后对其字节值使用百分号编码。此前的URI不受此标准的影响。【按道理来说,编码问题应该解决了】

但是因为历史原因,部分浏览器的url ,还没有完全采用utf-8编码。说白了大家统一认为path路径是用utf-8编码的没有问题,但是querystring 查询串该怎么编码,意见不统一。

这时,JavaScript 因为内部编码是(ucs-2 或者 utf-16 不确定),JavaScript的URL编码输出结果是UTF-8【或者Unicode排列值,不过这个已经废弃了】

所以,前端开发,要先了解一些浏览器url编码问题,然后尽量用JavaScript编码url。 

二进制数据

1994年发布的RFC 1738规定, URI中的二进制数据应该表示为字节的序列,然后对每个字节按照上述方式百分号编码. 例如,字节值0F (十六进制)应表示为”%0F“, 字节值41(十六进制)应表示为”A“或”%41“. 优先使用未保留字符来表示这些字节值,因为这使得URL更短.【这些都是ASCII编码  字符”A”对应 十六进制41】

RFC1738 规定:

“…Only alphanumerics [0-9a-zA-Z], the special characters “$-_.+!*'(),” [not including the quotes – ed], and reserved characters used for their reserved purposes may be used unencoded within a URL.”

“只有字母和数字[0-9a-zA-Z]、一些特殊符号”$-_.+!*'(),”[不包括双引号]、以及某些保留字,才可以不经过编码直接用于URL。”

字符数据

二进制数据的百分号编码过程已经被外推到字符数据,甚至到不适合或未被完全规范的地步. 在WWW初创阶段,仅仅处理ASCII字符是否编码问题,还没有什么问题。但随后发展到对非ASCII字符如何在URI中编码,缺少标准规范的情况下导致了歧义性的解释URI的错误。

大白话, 如基于RFC 1738与2396的协议规定,字符数据先要根据某种字符编码转换为字节流,然后再表示为URI。如果URI不提供是何种字符编码的提示信息,那么这个URI难以可靠的解析。【互联网早期,URI默认都是ASCII编码的字节流,所以解析没问题。后来各国文字编码的字节流,编码成url后,服务器解析url,然后将字节流解码成哪种编码就不知道了】

当前标准

2005年1月发布的RFC 3986,建议所有新的URI必须对无需编码的字符(下面红字RFC3986的规定中可出现的字符)不加以百分号编码;其它字符建议先转换为UTF-8字节序列, 然后对其字节值使用百分号编码(即URL编码)。此前的URI不受此标准的影响。

RFC3986文档规定,Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符。

非标准的实现

有一些不符合标准的把Unicode字符在URI中表示为: %uxxxx, 其中xxxx是用4个十六进制数字表示的Unicode的码位值。任何RFC都没有这样的字符表示方法,并且已经被W3C拒绝。第三版的ECMA-262仍然包含函数escape(string)使用这种语法, 但也有函数encodeURI(uri)转换字符到UTF-8字节序列并用百分号编码每个字节。

application/x-www-form-urlencoded类型

当HTML表单中的数据被提交时,表单的域名与值被编码并通过HTTP的GET或者POST方法甚至更古远的email把请求发送给服务器。这里的编码方法采用了一个非常早期的通用的URI百分号编码方法,并且有很多小的修改如新行规范化以及把空格符的编码”%20“替换为”+” . 按这套方法编码的数据的MIME类型是application/x-www-form-urlencoded, 当前仍用于(虽然非常过时了)HTML与XForms规范中. 此外,CGI规范包括了web服务器如何解码这类数据、利用这类数据的内容。

如果发送的是HTTP GET请求, application/x-www-form-urlencoded数据包含在所请求URI的查询成分中. 如果发送的是HTTP POST请求或通过email, 数据被放置在消息体中,媒体类型的名字被包含在消息的Content-Type头内部。

浏览器调试-Chrome调试JavaScript入门

平常在开发过程中,经常会接触到前端页面。那么对于js的调试那可是家常便饭,不必多说。最近一直在用火狐的Firebug,但是不知道怎么的不好使了。网上找找说法,都说重新安装狐火浏览器就可以了,但是我安装了好多遍,也没好使,后来听说Firebug停止更新了。没办法既然不给用,那我换浏览器不就可以了嘛!一开始想到就是谷歌,谷歌浏览器是常用来调试JS代码的工具,本文主要介绍如何利用谷歌浏览器来调试JS代码,协助我们进行开发工作,加快开发效率。

1、首先,打开谷歌浏览器,然后打开调试功能栏,按快捷键F12或者ctrl+shift+j,就可以打开谷歌浏览器的开发者工具。打开后页面如下所示。

2、下面主要介绍一下开发者工具中常用的几个基础常用功能。左上角第二个选项,是用来切换手机页面的。如果我们访问的网址是手机端wap页面,则点击此按钮,就可以模拟手机进行访问了。

3、Network是网络工具,可以查看请求数据的状态,类型,大小,时间等,如下图。Network是在调试中常用的工具,可以查看发送的请求是否正确,返回的数据是否正常等。

4、Sources可以用来查看页面的源文件,包括JS文件和Html文件。找到想要调试的JS代码,在代码前单击,即可设置断点。当运行JS代码时,会自动进入到断点执行。同Java调试类似,JS调试也可以单步运行、进入函数体内调试、直接运行到下一断点等。

5、如上图所示,右上角4个断点,分别是直接运行到下一断点、单步运行、进入函数体内运行、返回函数执行结果。对应的快捷键分别是F8、F10、F11和shift+F11。在调试时,把鼠标放在某个变量上,就可以查看该变量的运行值。

 

 

人要耐得住寂寞,才能守得住繁华。人生最痛苦的就是拿不起放不下,不属于自己的快乐,及时放手也许是一种解脱,生活中没有谁对谁错,只有适不适合。当发现很多已经改变,更要面对的是事实。

来自:https://www.cnblogs.com/yuanchaoyong/p/6172034.html

xml基础-dtd约束文件

dtd约束文件,是用来规定xml文件的语法规则的。

在eclipse中,编辑xml文件时,会根据dtd文件,给出xml标签提示。

在eclipse 联网的情况下,会自动下载dtd并保存到本地,下次编写xml文件时,仍会给出提示。


在eclipse没有联网的情况下:需要配置eclipse,来手动关联 本地 的dtd文件:
在eclipse属性中 xml栏的 catlog 中:

文件关联好后,需要关闭xml文件,然后重新打开,这样才能正确解析dtd文件,并给出提示标签。