计算机网络

https://xiaolincoding.com/network/3_tcp/tcp_interview.html

TCP

三次握手

img

  • 三次握手才可以同步双方的初始序列号,两次握手无法知道对方是否收到自己的初始序列号
  • 三次握手才可以避免资源浪费,两次握手服务端每次接受到syn报文就会建立一个连接,服务端没有中间状态给客户端来阻止历史连接,导致服务端可能建立历史连接,造成资源浪费
  • 三次握手才可以阻止重复历史连接的初始化(主要原因)主要是因为在两次握手的情况下,服务端没有中间状态给客户端来阻止历史连接,如旧的连接比新的连接先到达,那么就会和旧的连接进行初始化,并可能开始发送信息

四次挥手

客户端主动关闭连接 —— TCP 四次挥手

TCP与UDP

TCP UDP
是否面向连接
是否可靠
是否有状态
传输效率 较慢 较快
传输形式 字节流 数据报文段
首部开销 20 ~ 60 bytes 8 bytes
是否提供广播或多播服务

QUIC

连接

1-RTT模式

img

0-RTT模式

img

对比

image-20230608102440446

保持连接

image-20230608103659544

多路复用

image-20230608102721820

拥塞控制

image-20230608102404779

Http

TLS握手

img

  1. 先建立TCP连接,然后进行tls握手

  2. 先client hello 发送支持加密套件 tls版本 随机数c

  3. 然后server hello 发送加密套件 tls版本 随机数s 以及使用的证书

  4. 客户端会去校验证书,正确就会生成一个新的随机数pre-master 并通过私钥进行加密 发送 client key exchange 发送完之后还会对之前的信息通过摘要算法进行摘要,并使用此秘钥进行加密,验证加密的有效性

  5. 服务端进行解密得到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不同的是
  1. 使用红黑树维护了文件描述符列表,能够高效的进行增删改查文件描述符,epoll_ctl()只需要加入待检测的socket即可,不需要像select/poll复制整个集合到内核
  2. 基于事件驱动,通过回调函数将产生就绪事件的文件描述符,添加到链表当中,并将该列表返回给用户,返回的全是就绪事件的文件描述符,不需要想select/poll一样这个遍历
触发模式

水平触发(默认):如果内核缓冲区有数据,服务端回一直从epoll_wait中苏醒,调用读函数直到缓冲区被读完

边缘触发:无论有没有数据,都只会苏醒苏醒一次,需要一次性读完数据。

Netty

核心组件

Channel

EventLoop 代表处理IO事件的线程

wokerGroup

bossGroup

ChannelCtx

作者

leon Yan

发布于

2023-05-27

更新于

2023-10-03

许可协议


评论