《码出高效:Java开发手册》学习笔记1

一、数据在计算机中的存储方式以及相关运算
我们平常所使用的数据表示方法为十进制,而在计算机中的表示方法则是二进制,数字的表示通过0和1完成。
打个比方说,有8条电路,每个电路有高低两个电平状态。根据数学排列组和,他们之间有2^8 种情况,可以表示256种信号。表示的区间可以为0-255,最大数即为2^8-1。在计算机中因为存在正负的原因,一般将最高位作为符号为,0表示正数,1表示负数,这样8条电路可以表示的最大值即为01111111 即为127,负数为-128。
(ps 以前一直搞不懂的是,既然负数的最大绝对值为-128,为什么正数的最大值才是127呢,这次搞得比较清楚了,正数范围内少的那一个作为了0,即00000000这个数值,那么10000000这一个数则代表的是负数的128。这样的理解再结合数据的存储方式会更简单,下边会进行说明)
再计算机中类似于一条线路的被称为1位,即一个bit,简写为b,而8个bit组成一个单位,成为一个字节Byte, 简写为B,1024个字节简写为KB,依次类推就是我们熟知的MB,GB。
二进制整数在计算机中最终都是以补码的形式存储的。
正数的反码和补码与原码相同,即为本身。
负数的反码为其绝对值按位取反
补码为反码的末位加一。
对于-128的补码来说,首先求其反码,为01111111,
对于其补码,加一之后为10000000也就是-128的补码。

除了二进制之间的加减法外,还有一种位移运算,左移运算<<(左边二进制丢弃,右边补0),右移运算>>(右边二进制丢弃,左边正数补0,负数补1),以及无符号右移运算>>>。
左移运算中,因为是连带符号位一起移动的,所以其计算结果的正负是不确定的,即正数的运算结果可正可负,负数的运算结果可负可正。
右移运算是直接将最低为舍弃,而符号为不变。
无符号右移运算则是在最高位的符号位默认补0。

除此之外还要注意按位与和逻辑与以及按位或以及逻辑或之间的区别。
在这里插入图片描述
在这里插入图片描述
二、浮点数在计算机中的表示
科学计数法的相关概念:
在这里插入图片描述
当从数学世界的科学记数法映射到计算机内的浮点数,数制从十进制转变为二进制时,相关称谓有所改变:指数称为阶码,有效数字称为位数。
以32位单精度浮点数为例,最高位为符号位,符号位右侧8位为阶码位。后23位为尾数位。
符号位: 在最高二进制位上分配1位表示浮点数的符号,0表示正数,1表示负数。
阶码位: 在符号位右侧分配8位用来存储指数,作为阶码位。而阶码位存储的是指数对应的移码,而不是指数对应的原码或者补码。
移码的计算规则:[X移]=x+ 2^(n-1) n为x的二进制位数,含符号位
移码的几何意义是把真值映射到一个正数域,可以直观的反应两个真值的大小。
而在计算机中,假设指数的真值为e,阶码为E,则有E = e + 2^(n-1) - 1;
偏移值为 2^(n-1) - 1;而不是2^(n-1)的原因:

8个二进制位的取值范围为[-128-127],现在将指数变成移码的形式,即将区间[-128-127]正向平移到正数域,区间内每个数加上128,变为[0, 255],计算机中规定阶码全为0或者全为1的两种情况当作特殊值处理(0,无穷大)去掉这两个值,则范围变为[1,254],按照换算关系,这样得到的指数范围为[-127, 126],指数最大只能取到126,这样就缩小了浮点数的取值范围,所以将阶码的偏移量设为2^(n-1) - 1;这样表示的范围为[-126, 127]
PS:最小值范围变大了,这个为什么不做处理,为什么呢?
尾数位:在最右侧分配连续得23位来存储有效数字,此处得位数用原码表示。 在计算机中规格化得位数形式位1.xyz,所以23位所表示得其实就是小数点后的数值,1是默认省略的,这样实际是表示的为24位。
在这里插入图片描述
浮点数的存储导致精度变化说明:
在这里插入图片描述
浮点数之间的加减法运算:
(1)零值检测:如果存在一个数为0(阶码与尾数全为0),直接得出结果。
(2)对阶操作:通过比较阶码的大小来判断小数点的位置是否对齐,阶码不相等,表示并未对齐,若未对齐,则需要通过移动尾数改变阶码的大小。尾数向右移动则阶码加一,尾数向左移动一位,阶码减一。因为向左移动会使误差变大,所以一般为选择较小的阶码对其尾数进行右移操作。****(在进行负数移动时,首先求取后23号的补码,之后进行相应的移动,最后在最高位添加1,也就是默认的最高阶位1)
(3)尾数求和:在对阶操作结束之后,直接按位相加即可(如果是负数,需要转换为补码再进行计算)。
(4)结果规格化:如果运算结果不满足规格化要求,则需要通过尾数的左移或右移达到规格化形式,左移称为左归,右移称为右归。
(5)结果舍入:在对阶过程或右规时,尾数需要右移,最右端被移出的位会
被丢弃,从而导致结果精度的损失。为了减少这种精度的损失,先将移出的这部分数
据保存起来,称为保护位,等到规格化后再根据保护位进行舍入处理。
三、TCP/IP网络协议相关
TCP/IP中文译为传输控制协议/因特网互联协议,在这个家族中还有其他协议,HTTP,FTP,SMTP,UDP,PPP等协议。另一个比较耳熟能详的便是ISO/OSI的七层传输协议。
TCP的分层框架图如下图所示:
在这里插入图片描述
链路层:以字节为单位把0与1进行分组,定义数据帧,写入源和目标机器的物理地址、数据、校验位来传输数据。
在这里插入图片描述
网络层:根据IP定义网络地址,区分网段。子网内根据地址解析协议(ARP)进行MAC寻址,子网外进行路由转发数据包,这个数据包即IP数据包。
传输层:数据包通过网络层发送到目标计算机之后,应用程序在传输层定义逻辑端口,确认身份后,将数据包交给应用程序,实现端口到端口间通信。最典型的传输层协议是TCP和UDP,其中UDP是面向连接的,而UDP则是无面向连接的。
应用层:传输层的数据到达应用程序时,以某种统一规定的协议格式解读数据。
总结一下,程序在发送消息时,应用层按既定的协议打包数据,随后由传输层加上双方的端口号,由网络层加上双方的IP地址,由链路层加上双方的MAC地址,并将数据拆分成数据帧,经过多个路由器和网关后,到达目标机器。 简而言之,就是按 “端口+IP地址+MAC地址"这样的路径进行数据的封装和发送,解包的时候反过来操作即可。
3.1、IP协议
IP地址属于网络层,主要功能在wlan内进行路由寻址,选择最佳路由。IP报文的格式如下图所示。
在这里插入图片描述
TTL,它是数据包可经过的最多路由器总数。TTL初始值由源主机设置后,数据包在传输过程中每经过一个路由器TTL值则减1,当该字段为0时,数据包被丢弃,并发送ICMP报文通知源主机,以防止源主机无休止地发送报文。
ICMP它是检测传输网络是否通畅、主机是否可达、路由是否可用等网络运行状态的协议。ICMP虽然并不传输用户数据,但是对评估网络健康状态非常重要,经常使用的ping、tracer-t命令就是基于ICMP检测网络状态的有力工具。
3.2 TCP建立连接
传输控制协议(Transmission Control Protocol, TCP),是一种面向连接、确保数据在端到端间可靠传输的协议。TCP报文格式如下。
在这里插入图片描述
协议第一行的两个端口号各占两个字节,分别表示了源机器和目标机器的端口号。这两个端口号与IP报头中的源IP地址和目标IP地址所组成的四元组可唯一标识一条 TCP连接。
当客户端发起第一个请求建立连接的TCP包时,目标机器端口就是服务端所监听的端口号。比如一些由国际组织定义的广为人知端口号一一代表HTTP服务的80端口、代表SSI-I服务的 22端口、代表HTTPS服务的443端口。(平时所说的多少多少端口)。
TCP的FLAG位由6个bit组成,分别代表ACK、SYN、FIN、URG、PSH、RST,都以置1表示有效。重点关注SYN、ACK和FIN,SYN用作建立连接时的同步信号;ACK用于对收到的数据进行确认,所确认的数据由确认序列号表示;FIN表示后面没有数据需要发送,通常意味着所建立的连接需要关闭了。
以下是TCP三次握手连接建立过程
在这里插入图片描述

  • A机器发出一个数据包并将SYN置1 ,表示希望建立连接。这个包中的序列号假设是x
  • B机器收到A机器发过来的数据包后,通过SYN得知这是一个建立连接的请求,于是发送一个响应包并将SYN和ACK标记都置1。假设这个包中的序列号是y,而确认序列号必须是x+ 1,表示收到了A发过来的SYNO在 TCP中,SYN被当作数据部分的一个字节。
  • A收到B的响应包后需进行确认,确认包中将ACK置1,并将确认序列号设置为y+1,表示收到了来自B的SYN
    以下为三次握手过程中,信息的确认过程
    在这里插入图片描述
    3.3 TCP断开连接
    TCP四次挥手断开连接的过程大致如下:

在这里插入图片描述

  • A机器想要关闭连接,则待本方数据发送完毕后,传递FIN信号给B 机器。
  • B机器应答ACK,告诉A机器可以断开,但是需要等B机器处理完数据,再主动给A机器发送FIN信号。这时,A机器处于半关闭状态(FIN WAIT 2),无法再发送新的数据。
  • B机器做好连接关闭前的准备工作后,发送FIN给A机器,此时 B机器也进入半关闭状态(CLOSE_WAIT)0
  • A机器发送针对B机器FIN的ACK后,进入TIME-WAIT状态,经过2MSL(Maximum Segment Lifetime)后,没有收到B 机器传来的报文,则确定B机器已经收到A机器最后发送的ACK指令,此时TCP 连接正式释放。

在TIME_WAIT状态时,无法真正释放句柄资源,在次期间,Socket中使用的本地端口在默认情况下无法被使用,所以,可以通过调小TIME_WAIT的数值来提高效率。

TIME_WAIT分析相关文章

4、HTTPS
**HTTPS的全称是HTTP over SSL,SSL工作于应用层和传输层之间,为应用提供数据的加密(对称加密算法)传输。**因为对称加密算法的不安全,出现了RSA非对称加密算法出现了。以下为其大致原理图,类似于服务器之间的免密登录。
在这里插入图片描述
但是这样也是不安全的,万一直接把要传输的公钥进行替换呢?所以就出现了CA,通过证书的方式来验证合法性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值