1.bit与进制 (个人理解,具体电路是非常复杂的)
物理层数据流,bit表示物理层数据传输单位,
一个电路当中,通过通断来表示数字1和0
两个电路要通讯,至少要两根线,一根作为电势参照,一根或者多根作为高低电势判断
以两根举例,他一次只能传输一个信号,所以系统间通讯是二进制,如果是N根(包括参考电线),那么系统间通讯是2^(N-1)进制,(3根 4进制 , 4根 8进制, 5根 16进制。。。。。)
网线是8根,实际有效是四根(不包括参考电线),所以网络传输是16进制(范围:0-F)
2.进制与位
计算机系统存储、运行、计算(寄存器、内存等)都是用的二进制,所以数据接受过来之后,要进行进制转换,比如16进制 的 C 转换为二进制 是 11000 , 原本16进制只要一位就能表示,转换之后需要5位表示。位就是数字再该进制下表示所需要的长度。
注:进制越大,1bit传输的数据越多,因为1bit指的就是1位
3.bit与时钟 (窗口) (个人理解)
时钟是一个振荡器,cpu去处理数据只能是再周期内完成,一个周期只能处理一个指令,但是系统有很多线程、进程、应用程序,不可能cpu只处理A程序,完了之后再去处理B程序,这样会导致很多阻塞,所以cpu是一个周期内处理一下这个,下过周期处理另外一个。。。。
这样会有问题,假设两个系统通讯,A系统要发送给B系统,但是某个时刻A系统发送了数据过去,B系统在处理别的,这样会丢失数据,所以有了窗口概念,也就是B会有一个缓存区,缓存B系统一个周期或者多个周期间接收到的数据,等B开始处理这边数据的时候就从窗口缓存中读取处理,然后清空或者清理部分缓存出来。
(tcp协议发起建立链接之后,服务端回复ack会带窗口大小等信息,防止客户端一直不停的发消息)
4.OSI七层网络架构:
物理层、链路层、网络层、传输层、会话层、表现层、引用层
上面讲了物理层,链路层就是我数据包从A发送到B,期间有很多网卡,链路就是网卡间数据传输(物理地址)比如 我电脑连了wifi,我发数据到百度,先是我这边通过网线把数据给到交换机,然后路由器再把数据给到上一层网络,层层上传一直到百度服务器。物理地址:A->B ->C->D->百度的物理地址(有冲突域、广播域,这里不说了)
网络层:ip协议,有IPV4 \ IPV6 一般是IPV4 ,他是数据包从一个ip(主机)到指定的ip(主机),不同局域网有相同的ip,为了确定网络位置,有了网络位置、主机位置、子网掩码
如果N台电脑全部用集线器链接起来,分配ip是有限的,所以要网络分层,然后有了子网、掩码、寻址。比如 192.168啥的都是内网用 127.0.0.1啥的都是本地回环地址 (具体ip段用作什么可以自行百度),然后为了广播快就有了掩码,把同一层网络的主机,根据ip掩码进行广播(网络位置)
比如某一层有五个主机 43.120.4.1、43.120.5.1、43.120.8.1,那么,五个主机的掩码可以为 255.255.255.0也就是只要前面三段来判断网络位置 43.120.4 、 43.120.5、 43.120.8
比如这一层来了个数据包要去 43.120.5.14这个ip的,他会判断是那些网络位置,这里就是43.120.5这个网络位置,然后他就只会给43.120.5这个下面的主机进行广播。
如果你把43.120.8.1的掩码改成了255.255.0.0,那么他的网络位置就是43.120,也会进行广播
大概是这样,不过数字可能有问题,他是二进制的,掩码是要连续的1111和000两部分组成
比如 11111111.11111111.11111111.00000000 或者11111111.11111111.11111000.00000000
然后他去判断网络位置也是通过上面主机的ip二进制和掩码进行截取(&逻辑)
注:baidu.com是不能传输的,所以要进行dns去查询这个域名对应的ip然后封装数据包
传输层:协议一般是TCP\UDP(具体端口到端口的数据传输)
是端口对端口的,基于网络层协议,UDP是不稳定的,他不会占用端口一直等回复的,TCP是要等回复的ACK (所以会有DOS攻击) 半链接攻击是发送SYN,然后服务器发送SYN+ACK包(服务等待)然后我这边不发ACK包故意让服务器等,让他占资源 ;全链接攻击是服务器发了SYN+ACK包之后,我回复ACK包(服务器会进入接收数据状态),然后不发数据也不发FIN包。伪造攻击是别人TCP正常沟通中,我伪造客户端ip,发送rest包(前提是要能拿到客户最新的序列号,然后+1发过去,一般要处于网络中间位置截获),让服务器清空正常的窗口数据。
DDOS攻击就是一堆肉鸡一起对某个服务器同时发起DOS攻击
会话层:系统给其他系统或用户开的一个会话窗口(session,服务要保存会话状态、身份认证)
HTTP\HTTPS协议 HTTP数据是可以抓的,明文的,HTTPS是在TCP和HTTP之间加了一层SSL/TSL协议,对数据加密,他是服务器生成公钥、私钥和一段明文,然后将明文HASH(报文)再私钥加密生成密文(签名),然后把签名、公钥、明文交给CA机构签发证书(包括生效、失效等信息)。浏览器访问https链接会下载安装证书 ,然后校验签名:明文HASH(报文) 然后 公钥解密签名得到“报文”,比对两个HASH报文是否一致,一致就说明服务器是信任的,然后客户端也要生成秘钥(对称加密的)然后通过公钥加密发给服务端,服务端拿到 “对称加密秘钥”的密文 之后用私钥解密出 对称加密秘钥 ,然后双方使用对称加密秘钥进行通讯
表现层:(具体的内容了,有不同表示形式,就有了不同协议,比如html是超文本协议、doc是文本、excel表格、exe可执行文件、zip压缩包等)
浏览器自己根据http头拿到格式进行内容解析显示出来就是表现层
应用层:(系统间的状态、协议等)
前端服务、微服务之间、以及项目服务与数据库之间的交流协议等等。
注:不同应用间数据交流用到的协议层数未必都要七层,比如多台计算机用集线器链接,只需要物理层就可以了(鼠标、键盘、网卡等),主机到主机(局域网内,通过交换机连接)只需要物理层+链路层就可以了
个人理解AI: 就是为了能和支持不同层协议系统进行沟通,比如:AI和网站沟通就要充当浏览器等,和DOC文档沟通,就要把自己当作个文件,输出相关内容给doc应用程序,保存doc的修改等;要和浏览器沟通,就要充当网站;最终是与人沟通,就要充当人,就要会发声、语义解析等
原码、反码、补码、移码 (对于二进制数据而言的) 校验码
原码:原本的数字表示 比如 0 1100011 负数是 1 1100011 (第一位是符号位)
反码:正数是他本身,负数是除了符号位,其他取反 比如 0 1100011 1 0011100(其他位和符号位异或运算)
补码: 正数补码是他自己,负数的补码是反码+1
校验码:校验数据包的正确性,以及纠错,有奇偶校验、海明校验、循环冗余校验(CRC ) 这里不细说了;
为啥要反码:因为计算机只有加法器,减一个数就相当于加该数的负数 结果再取反。
补码待会说
原理:负数的反码是(最高数-他) 比如(八位数,除去符号位是七位)
0001100 取反就是 1111111-0001100 = 1110011
然后加上被减数(带符号位) 就是 被减数(符号位0)+(最高数-减数)(符号位1)
注:符号位在第八位,这里定义的最高数是七位的最高数(所以加符号位也就是最高数+1)
相当于
结果 = 被减数+最高数-减数+最高数+1
= (最高数+最高数+1)+(被减数 - 减数)
注:(最高数+最高数+1) 相当于是(11111111八位) 最高数+1 是(10000000)八位 再加个最高数就是(11111111八位) 所以多加一就会进一位到第九位(高于八位会舍去),
所以,当被减数 - 减数 >= 1 的时候
会近一位到第九位,舍去(相当于减去了一个(100000000 九位)),也就是(高位数+1)*2
高位数加1 是 (10000000 八位)左移一位相当于是乘以2
此时:
结果 = (最高数+最高数+1)+(被减数 - 减数)-(高位数+1)*2
=最高数+最高数+1+被减数-减数 - 2*最高数 - 2
=被减数 - 减数 -1
他是正数,且符号位正好是0 ,取反码就是他自己,这里多减了1,所以才有补码(反码+1)
当被减数 - 减数 <1 的时候取反逻辑:
不会进位到第九位,
此时:
结果=(最高数+最高数+1)+(被减数 - 减数)
= 最高数+最高数+1 +被减数-减数
由于 被减数 - 减数<1 也就是 0 或者负数,这时候没有进位,最高位是1(符号位)
表示他是负数,
然后取反:也就是最高数(七位) - 结果(不带符号位的),然后补上符号位
结果不带符号位也就是(减去了 10000000)最后补上符号位也就是(加上了10000000)
也就是= 最高数 - (最高数+最高数+1+被减数-减数 - (最高数 + 1))+最高数+1
= 最高数 - (最高数+被减数-减数)+最高数+1
= 减数 - 被减数 + 最高数+1
其中(最高数+1)是符号位 ,减数-被减数 负数取了相反数 正好
补码会不会影响这里呢,不会,因为减数取补码+1,然后最终结果是负数取相反数+1
也就是减1再加了1,正好。
然后byte为啥是 -128 到 127 ,因为反码逻辑下,负数表示是 -127 到 -0 ,正数 是 +0 到 127
然后0重复表示了,
然后补码是:比如 -1的补码是 11111111(原码10000001 反码11111110)
-2的补码是 11111110(原码 10000010 反码11111101)
依次类推,补码是-1 原码 +1
一直到 -1*(2^8-1)反码能表示的极限(相当于int的-127) 10000001(原码11111111 反码 10000000)
在-1的时候,反码是不能减了,他符号位不能动的,但是补码还可以-1,此时是
-1*2^8 (相当于int的-128) 10000000(原码 100000000 九位了,表示不了,反码也就没了)
因此规定 int的-128没有原码和反码,只有补码,记做1000000......(原本是-0的反码)
移码
用于小数表示,科学计数法
比如 十进制 31.415926 的科学计数法是 3.1415926*10^1 (底数是 0-10之间的数(不包括0和10))
这里的底数是3.1415926 指数是 1
二进制表示: 比如 111.00101 科学计数法是 1.1100101*2^2 (底数是0到2之间的数)
底数是1.1100101 指数是 2
由于二进制底数的整数部分只能是1,所以在存储的时候 只要记录符号、小数部分和指数就可以
float是32位 符号一位 指数位8位 23位尾数
由于指数也有负数,这里没有用补码形式表示,用的移码,也就是有个偏移量 127
原本范围是 0 到 2^9-1
现在都减去127,就成了 -127 到 2^9 - 128 范围
比如 -3.125 表示二进制是 -11.001(整数短除法,小数乘法去换算)
科学计数法是 -1.1001*2 尾数是 1001 指数 是 1 符号位是 1
指数的移码是 1 对应的原码要+127 = 128 = 2^7 对应二进制 (10000000八位)
所以 他的表示是 1 10000000 10010000000000(后面一堆0不写了)
duble是64位 1个符号位 11位指数位 52位尾数位