一、序
毕业已经两年了,曾经在学校学习的知识早已还给老师了,已经很久没有好好学习了。虽然曾经也是高收入群体,但是因为从此再也不写代码了,觉得人生都没有乐趣了,所以果断离职了.....但是看着身边越来越多的技术大牛和高收入人群和之前对比落差太大,心中未免有些不甘,所以重新捡起被遗忘的知识。曾子曰:“吾日三省吾身:为人谋而不忠乎?与朋友交而不信乎?传不习乎”。
二、比特(bit)、字节(byte)
bit又称为位,1 byte = 8 bit. 记下来就好,想必都听说过8位机,8位机(bit)有8条线路,每个时钟周期只能处理8个电信号(00001111),组成一个字节(btye),而经常听说32位(bit)、64位(bit)机即是指,在一个时钟周期内可以处理32/64 位(bit).
我认为字节(byte)是基本的存储单元,比特/位(bit)是CPU基本的运算单元。
1字节(byte)表示的带符号位数字范围,最高位表示符号位,-2^7 ~ 2^7-1,即-128 ~127.为什么是-128-127呢?
因为最高表示符号位,正数是0,负数是1。
正数:首位为0,后七位二进制数即为所表示正数的绝对值
负数:首位为1,负数在现代计算机里一般用补码表示,后七位二进制数的原码+1 (补码 = 原码取反+1,将所有位取反,再加1)。补码
0000 0000 = 0
补码1000 0000 在10进制里表示什么??? 最高位为1,所以是负数,计算反码+1。(取反) 127(0111 1111) + 1(0000 0001)= 1*2^6 +1*2^6.......+1*2^0 + 1 = 128, 最高位为1(负数),所以为-128
0111 1111 = 127
补码 1111 1111 -1
1Kb = 1024bit, K意为千, 2的10次方(因为我们日常使用10进位,因为习惯,所以计算机就被设定成了2的10次方的进位,2*2*2*2*2*2*2*2....
1个字母/数字 占 1个字节,而汉字占两2个字节。因为带符号位的1字节可以表示0~2^7,128个不同的组合,对于数组和字母符号绰绰有余,所以老外的英语学起来比较简单。
而一个中文汉字在GBK编码里占2个字节,因为中文博大精深,1字节只能表示128个东东根本不够用,因为字节是基本的存储单元,没有听说过1.3个字节或者1.5个字节东西吧,0~128*128个组合足够表示汉字。所以大于127的才有可能是汉字
所以,一个含有中文的URL编码的解码方式如下,php代码如下:
<?php function link_urldecode($url) { $uri = ''; $cs = unpack('C*', $url); $len = count($cs); for ($i=1; $i<=$len; $i++) { $uri .= $cs[$i] > 127 ? '%'.strtoupper(dechex($cs[$i])) : $url{$i-1}; } return $uri; } ?>
三、网速100M
我家的网是100M,为什么下载速度不是100MB/s?
这里的100M是指的是100Mbps(megabits per second),这是的单位是bit....所以我说只有存储才是byte..
100Mbps = 100*1042K bit/s 1byte = 8 bit , 100Mbps / 8 = 12.5MB/s,所以理论的最大下载速度是12.5MB/s.而且这里默认的是下行带宽,100M,上行带宽一般只有2Mbps,实际最大的上传速度只有256KB/s....
链路层,太网的物理特性决定了数据帧的长度为(46+18)-(1500+18),其中的18是数据帧的头和尾,也就是说数据帧的内容最大为1500(不包括帧头和帧尾),即MTU(Maximum Transmission Unit)为1500; 网络层,因为IP包的首部要占用20字节,所以这的MTU为1500-20=1480; 传输层,对于UDP包的首部要占用8字节,所以这的MTU为1480-8=1472; 所以,在应用层,Data最大长度为1472,单位是byte 约等于1.43Kb 2M的上行带宽举例,理论上每秒可以发出179次网络请求。
Mark:2017年10月17日