本次主要阅读完《码出高效》的第一章,本章内容如下:
1、计算底层0与1
2、浮点数
3、字符集与乱码
4、CPU与内存
5、TCP/IP
6、信息安全
7、编程语言的发展
个人比较感兴趣主要集中4、5、6。
整理出这三节比较重要知识点。
CPU与内存
CPU内部结构图
各个部分用途说明
计算器存储方式
TCP/IP
网络协议
TCP/IP是一个网络传输协议框架,是一个协议族。
其中包含:HTTP、HTTPS、FTP、SMTP、UDP等
另外有一个传输协议ISO/OSI 七层传输协议(已被淘汰)
TCP/IP分层协议结构
链路层:以字节为单位把0和1分组。定义数据帧、写入源和目标机器的物理地址、数据、校验位来来传输数据
链路层报文结构
MAC地址6字节48位,通常用16进制表示。前24位管理机构分配,后24位厂商分配,保证全球唯一。
网络层:根据IP定义网路地址、区分网段。子网内根据地址解析协议(ARP)寻找mac地址。子网外进行路由转发数据包(IP数据包)
传输层:数据包通过网络层传输到目标计算机,应用程序在传输层定义端口,确认身份之后,将数据包交给应用程序。实现端口与端口之间传输。
UDP:面对无连接、不可靠传输,多用于视频通讯、电话会议。
TCP:面对连接、可靠连接(具备失败重发机制)
应用层:数据到达应用程序,以某种统一协议解读数据。
总结:应用层按协议打包数据、传输层加上双方端口、网络层加上双方IP地址、链路层加上双方MAC地址,并将数据拆分成数据帧。
IP协议
IP协议是一种面向无连接、无状态、没有额外机制保证发送包是否有序发送达。
IP规定IP地址格式,该地址相当于在逻辑意义上进行网段的划分,给计算器额外设置唯一地址。MAC地址虽然也是唯一地址,但是无法全世界广播,通过IP地址进行分层管理。
IP主要功能在WLAN内进行路由寻址,选择最佳路由。
IP报文格式
生存时间TTL:表示数据包可以经过的最多路由器总数。每经过一个路由TTL都减1,当该值为0,数据包则被丢弃,并发送ICMP报文通知源主机,防止源主机无休止发送报文。
ICMP:是一种检测网络是否通畅、主机是否可达,路由是否可用的网络协议。ping命令基于该协议。
报文分片:不同物理硬件拥有不同物理特性,对数据帧的最大长度有不同限制。不在物理网之间需要对IP报文进行分片,该功能由路由器完成。
TCP连接
TCP连接是一种面向连接、确保数据在端对端间可靠传输的协议。
TCP报文格式
序列号:指所发送数据包中数据部分第一个字节的序号。
确认序列号:期望收到来自对方的下一个数据包数据部分第一个字节的序号。
SYN:用于建立连接的同步信号
ACK:用于收到的数据进行确认,所确认的数据有确认序列号表示。
FIN:表示后面没有数据可以接收,意味连接需要关闭
TCP三次握手创建连接
连接三个步骤
1、A机器发出数据包,SYN标识为1(表示建立连接),序列号seq为x。
2、B机器接收到A机器请求建立连接(SYN标识判断),发送一个响应报文。SYN和ACK标识都为1,序列号seq为y,确认序列号ack为x+1.
3、A机器收到响应报问题,进行最后一次确认报文。ACK标识为1,序列号为x+1,确认序列号为y+1.
三次握手原因
两次握手导致问题
报文TTL生存时间会比TCP请求超时时间要长。如果存在从超时重发的情况,A和B机器已经完成数据传输并关闭连接之后,B机器才接收到超时重发请求,则会出现B机器单方面建立连接(A机器不是SYN_SENT状态,自动抛弃报文)。
如果为三次连接确认,则B机器还需要跟A机器进行确认。A机器不是SYN_SENT状态,自动抛弃报文。B机器长时间没有接收到A机器确认报文,也会导致建立连接失败。
(注意:最大连接数由服务器的最大文件句柄数 ulimit -n 可查看)
TCP断开连接
断开分四个步骤
1、A机器本方数据传输完毕,需要关闭连接,发送关闭报文给B机器(FIN标识为1)
2、B机器收到关闭报文之后,给A机器发送响应报问题。等B机器处理完数据,在发送FIN报文。A机器进入半关闭状态
3、B机器做好连接关闭前的准备,发送FIN报文给A机器,且B机器进入半关闭状态(CLOSE_WAIT状态)。
4、A机器发送针对B机器FIN的ACK报文,进入TIME_WAIT状态。经过2MSL,没有收到B机器传来的报文,则确认B机器收到ACK报文,TCP正式断开连接。
CLOSE_WAIT和TIME_WAIT
如果服务器出现大连COLSE_WAIT和TIME_WAIT状态,则会加重服务器负载。
需要提供针对性优化
主要方案:将TIME_WAIT调小,2MSL(两分钟)在目前超速网络状态之下是极大浪费。
方法:通过修改/etc/sysctl.conf配置文件调整。参数:net.ipv4.tcp_fin_timeout = 30 (建议低于30秒)
SQL优化
数据库请求响应都为100ms以内,秒级优化方案
1、建立高效且适合的索引
2、排查连接资源未显式关闭
3、合并短请求:合并请求有效减少连接次数。
4、合理拆分多个表join的SQL,若超过三个表则禁止join
5、使用临时表:将中间结果放入临时表,重新创建索引。再用临时表做后续操作。
6、应用层优化:数据结构优化,并发多线程改造。
7、改用其他数据库