计算机网络
- 这些是我的总结,面试的时候,我的计算机网络知识不是很好,在这个闲暇之余,整理一下这个笔记
- 哎,主要是计算机网络在我用到的地方,确实不是很多,所以很多都没背,哎
网络模型
这个是最简单的,程序员需要掌握四个
- 应用层: http, ftp, dns, SMTP等
- 传输层: TCP, UDP
- 网络层: IP
- 链路层:主要是物理设备
数据从应用层开始, 开始组成相关报文, 四个层都会对数据进行组装, 形成数据段,然后发送出去,
- HTTP: 在网络上发送请求的时候, 本质上其实是封装socket, 按照一定的规范,组成报文格式,然后发送即可
- DNS: 通过域名查找对应的IP地址, 这个过程是递归发生的,
- 首先在本地DNS上查找相关域名
- 如果本地查不到, 就会向跟服务器上查找域名, 递归的找到最终域名, 然后得到最终的IP解析, 然后发送给要请求的人
HTTP
- 本质上来说, 在应用层, 按照http协议一样, 组装http报文的协议格式, 就可以发送http协议的请求,
- 组装成http形势的报文, 然后发送对应的的字符串就可以发送http请求了
- 如何解析这个http请求?
- 查看http协议的组装就可以看到, 可以根据
\r\n\r\n
这个命令行进行解析,根据这个可以分割其中一部分来得到最终的数据
- 查看http协议的组装就可以看到, 可以根据
HTTPS
- http是明文的,那么https是如何解决这个问题呢?,其实就是加入了TLS/SSL这个协议,
- 本质上是在三次握手之后,发送数据之前,然后进行SSL/TLS数据加密,然后才能发送对应的数据
- SSL/TLS是用的RSA加密的方式,是用安全密钥的方式,通过第三方CA机构来保证数据的安全。
版本更替
- http1.1: 是用长连接的方式改变http1.0的短链接的性能开销,防止每次进行三次握手导致性能开销。
- http/2
- 最主要的是全面采用了二进制的格式,头信息和数据体都是二进制,统称为帧,
- 二进制可以加快数据的传输效率
- 多路复用,可以并发传输, 这里是用STREAM流进行传输, 加快输入效率
- 头部压缩
- 最主要的是全面采用了二进制的格式,头信息和数据体都是二进制,统称为帧,
幂等和不幂等
- GET是安全且幂等的, 幂等的话不论操作多少次返回的结果都是一样的, 一点像纯函数的性质
- POST是不安全的, 不幂等的,每次操作,可能得到的数据是不一样的
TCP
对于网络传输来说, TCP和UDP都是基于IP这个不可靠协议进行传输的, 对于传输来说, TCP添加了很多控制机制来保证数据的正常传输,
三次握手
TCP连接的时候,在连接的时候为了保证数据的安全性,在传输数据之前,要进行三次握手保证数据的安全,
- 为什么是三次呢?而不是两次,四次呢?
- 三次握手要确保socket初始化,序列号,窗口大小,和TCP连接
- 三次握手可以阻止重复历史连接的初始化
- 同步双方的序列号
- 避免资源的浪费
- 第三次握手的时候就可以传输数据了,但是第一次和第二次传输的时候是不会传输数据的,
报文攻击
因为三次握手的时候,发送SYB报文的时候,会发送报文攻击,导致这里会发生卡顿,为什么呢,这里的操作系统的实现如下:
- 操作系统会维护两个队列,一个是TCP半连接队列和TCP全连接队列
- 客户端在connect之后,会发生三次握手,这时候会将这个fd,也就是文件描述符放到半连接队列中
- 但连接建立完之后,就会将这个文件描述符加入到全连接队列中
- (这个队列是一个链表)
这里的坑点就是这个半连接队列,如果出现客户端不往服务端传输数据,那么就会将半连接队列卡满,直接G,那么怎么解决呢?
- 增大TCP半连接队列的数量
- 减少重传的数量
四次挥手
四次挥手是为了保证最后的数据能够准确无误的到达对方,主要是TIME_WAIT状态比较多
TCP重传
数据一次发送可能发送丢失,那么就需要重新传送,
滑动窗口
- 因为数据传输,不是一个一个数据一个个传输的,在传输的时候,会限定一个窗口的范围,当在这个范围内时候,数据会进行传输,左窗口在保证全面输出到对面的时候,才会向右移动,右窗口会往右边移动,等到数据全部传到对岸的时候,才会表明数据的正确
- 在窗口的中间,有的数据可能已经发送到达,但是有些数据并没有发送到,这时候可能有快速重传,有的是并发传输,
慢启动
提高并发量的时候,慢慢的启动数据,1 2 4 8 这样达到临界区,如果达到拥塞,那么就会变成 1 2 4 8 9 10 11 12 这样增加
WebSocket
服务端如何主动发送消息给客户端?
- 因为TCP协议是全双工的,但是HTTP协议确实半双工的,那么其实可以基于TCP协议,弄一个在应用层的全双工协议,然后双方进行通信
建立流程
- 在发送建立WebSocket的流程的时候,会使用http这个协议进行通信建立连接
- 之后就是用WebSocket建立连接就行了
其他问题
https建立连接的过程
- http会进行三次握手的连接,然后建立SSL连接
- 服务器会配置好这个数字证书,公钥和私钥,将其传递给客户端,客户端会通过CA机制来验证其中的公钥是否有效
- 客户端和服务端会是用公钥和私钥(RSA加密)来获取一个随机值,(客户端生成的一个随机值,然后传输给服务端)
- 然后客户端和服务端之间的加密就是用这个随机值来进行对称机密,来进行双方的运输,
非对称加密(RSA,CA机构)来得到只有双方知道的一个密钥,然后之后就只用对称加密来得到这个密钥。
http各个版本的区别
- 1.1
- 主要是增加了一个长连接,防止每次连接的时候都会进行三次握手
- 2.0
- 主要是全部变成二进制的数据进行传输,然后
- 多路复用,因为可能会出现堵塞的情况,所以这里使用了加入了多路复用的
WireShark能抓https包么
- https因为是加密的,但是wireshark提供了对应的解包能力,具体原理好像是wireshark得到对应的随机值,因为随机值在本地,所以可以进行解析
rpc协议和http协议的区别,为什么还要用rpc协议
- http本身像是一个协议,而rpc更像是一种调用方式,
- http可能更多传输的是一个body,也就是一个json文件,这时候可能需要解析,但是rpc可以对进行定制,专门用于自己内部服务
- HTTP中可能有更多的无用信息,那么传输的时候会耗费流量,并且速度变慢
- 可以更加的轻量化,更加的定制,节省一定的流量
输入网址到页面显示,发生了什么
- 数据