网络基础
Socket
Socket就是个代码库或接口层,介于操作系统内核和应用程序之间,提供了一些高度封装过的接口,使应用程序能够使用内核的网络传输功能。
在操作系统内核空间里,实现网络传输功能的结构是sock,基于不同的协议和应用场景,会被泛化为各种类型的sock,它们结合硬件,共同实现了网络传输功能。为了将网络传输功能暴露给用户空间的应用程序使用,引用了socket层,同时将sock嵌入到文件系统的框架里,sock就变成了一个特殊的文件,用户可以在用户空间使用句柄(也就是 socket fd)来操作内核sock的网络传输功能。socket fd 是 int 类型,所以 socket 翻译为套接字(一套用于连接的数字),就很合理啦。
TCP & UDP
TCP的特性:面向连接、可靠的、基于字节流(01二进制字节流)
TCP 重传机制
TCP会给发出的消息打上一个编号,也就是sequence,接收方收到后回一个确认ack包,发送方可以通过ack的数值知道接收方收到了哪些sequence的包。如果长时间等不到对象的确认,TCP就会重新发一次消息。
缺点:对性能有影响。所以TCP协议需要尽可能避免重传,于是就有了滑动窗口和拥塞控制机制。优化重传性能:将数据包分段。
TCP 滑动窗口机制
TCP会根据发送窗口和接收窗口(接收方当前能够接收的数据量大小)的大小,来控制自己发送的数据量,这样就能大大减少丢包的概率。通过滑动窗口机制实现了流量控制。
TCP 拥塞控制机制
根据网络环境,调整自己的发包数量:不断加码发送的数据量,直到出现丢包。这样就能感知到当前的网络环境情况。
生产环境基本不会用到裸UDP,一般会在UDP的基础上做一些重传或乱序处理逻辑,比如kcp、Quic、HTTP3.0协议。
纯裸TCP的粘包问题?
TCP基于字节流,数据无边界,没有办法区分消息边界。解决办法:在消息体前加上消息头。
UDP一定比TCP快吗?
不一定,UDP本身不会对数据进行分段,如果UDP上层实现了重传机制,UDP会重传整个大数据包,速度就会慢。
WebSocket
发起一个请求,在较长时间内等待服务器响应。
TCP是全双工的,同一时间双方都可以主动向对方发送数据;
HTTP1.1是半双工的,同一时间客户端和服务端只能有一方向对方发送数据;
建立连接
如何在用户不做任何操作的情况下,网页能收到消息并发生变更?
- 伪服务器推(HTTP定时轮询):客户端定时自动请求服务器;
场景:某信扫码登录,客户端不断向服务器询问是否有人扫过这个码;
缺点:服务器压力大、占用网络带宽、用户需要等待一小段时间 - WebSocket(长轮询)
HTTP
详见
RPC
详见 RPC
参考文献:
socket是什么视频教程