计算机网络
https://xiaolincoding.com/network/3_tcp/tcp_interview.html
TCP
三次握手
- 三次握手才可以同步双方的初始序列号,两次握手无法知道对方是否收到自己的初始序列号
- 三次握手才可以避免资源浪费,两次握手服务端每次接受到syn报文就会建立一个连接,服务端没有中间状态给客户端来阻止历史连接,导致服务端可能建立历史连接,造成资源浪费
- 三次握手才可以阻止重复历史连接的初始化(主要原因)主要是因为在两次握手的情况下,服务端没有中间状态给客户端来阻止历史连接,如旧的连接比新的连接先到达,那么就会和旧的连接进行初始化,并可能开始发送信息。
四次挥手
TCP与UDP
TCP | UDP | |
---|---|---|
是否面向连接 | 是 | 否 |
是否可靠 | 是 | 否 |
是否有状态 | 是 | 否 |
传输效率 | 较慢 | 较快 |
传输形式 | 字节流 | 数据报文段 |
首部开销 | 20 ~ 60 bytes | 8 bytes |
是否提供广播或多播服务 | 否 | 是 |
QUIC
连接
1-RTT模式
0-RTT模式
对比
保持连接
多路复用
拥塞控制
Http
TLS握手
先建立TCP连接,然后进行tls握手
先client hello 发送支持加密套件 tls版本 随机数c
然后server hello 发送加密套件 tls版本 随机数s 以及使用的证书
客户端会去校验证书,正确就会生成一个新的随机数pre-master 并通过私钥进行加密 发送 client key exchange 发送完之后还会对之前的信息通过摘要算法进行摘要,并使用此秘钥进行加密,验证加密的有效性
服务端进行解密得到pre-master 至此双方都拥有了 双方随机数+pre-master的私钥,同样也会对之前的信息进行摘要并进行加密,发送给客户端已验证加密的有效性
与Rpc的区别
http使用的是文本协议,rpc用的是二进制协议序列化和反序列化(kyro和)
http通过url调用,rpc使用的函数调用
http使用url参数或者请求体传送参数,rpc通过函数参数传递
http通常没有rpc快
2.0与1.0的区别
头部压缩,许多头部字段可以通过数字表示,在查表的操作
二进制帧, 原来基于ASCII协议的编码方法,转化成了二进制帧的方式
并发传输,多个资源使用一个TCP连接(队头阻塞,后面可能已经获取消息但还是查询不到)
服务器主动推送资源
3.0更新
使用QUIC协议,
连接块,能减少握手时间,在0RTT-1RTT时间就可以完成一次握手
无队头阻塞,通过udp实现的可靠传输,复用一个连接但是,每个数据包归属与不同stream
连接迁移,当【原地址+源端口+目标地址+目标端口】发生改变的时候,可以通过连接id直接恢复连接,而TCP做不到,需要建立新的连接
IO多路复用
文件描述符拷贝到内核,然后系统遍历文件描述符,将此文件描述符标记为可读或可写,然后将整个描述符返回拷贝回用户态,还需要遍历一次对可读可写的文件描述符进行操作,这样的话需要把整个集合拷贝两次,也要遍历两次
通过一个进程来管理多个socket
select/poll/epoll:先将所有连接传给内核,由内核返回产生了事件的连接,然后在用户态中处理这些请求。
select/poll
一开始的话,会将所有文件描述符拷贝到内核,然后系统遍历文件描述符,将此文件描述符标记为可读或可写,然后将整个描述符返回拷贝回用户态,还需要遍历一次对可读可写的文件描述符进行操作,这样的话需要把整个集合拷贝两次,也要遍历两次
select poll,本质上没有区别,select使用的是BitsMap数组,有上限为1024,而poll使用的动态数组,使用链表组织,但是仍然会有系统文件描述符限制。
epoll
流程
创建socket
绑定端口并监听
使用epoll_create(),创建epoll对象
epoll_ctl()加入需要监听的文件描述符
epoll_wait()返回就绪事件的文件描述符
与select/poll不同的是
- 使用红黑树维护了文件描述符列表,能够高效的进行增删改查文件描述符,epoll_ctl()只需要加入待检测的socket即可,不需要像select/poll复制整个集合到内核
- 基于事件驱动,通过回调函数将产生就绪事件的文件描述符,添加到链表当中,并将该列表返回给用户,返回的全是就绪事件的文件描述符,不需要想select/poll一样这个遍历
触发模式
水平触发(默认):如果内核缓冲区有数据,服务端回一直从epoll_wait中苏醒,调用读函数直到缓冲区被读完
边缘触发:无论有没有数据,都只会苏醒苏醒一次,需要一次性读完数据。
Netty
核心组件
Channel
EventLoop 代表处理IO事件的线程
wokerGroup
bossGroup
ChannelCtx