面试通关计算机网络–socket和websocket

kayokoi 发布于 28 天前 60 次阅读


Socket:网络编程的基石与“插座”

你说的很对,Socket(套接字) 可以理解为网络通信的端点,它抽象了底层的网络通信细节。

  • 定义:

    • 更准确地说,一个建立的TCP连接的Socket通常由一个四元组唯一标识:(源IP地址, 源端口号, 目标IP地址, 目标端口号)。
    • 而一个监听状态的TCP Socket(服务器端等待连接的Socket)通常由(本地IP地址, 本地端口号, 协议类型TCP)来标识。
    • 所以,你说的 IP地址 + 端口 + 协议​ 是一个很好的概括,它描述了定位到一个网络服务所需要的基本元素。
  • 本质:

    • 它是一个编程接口 (API),是操作系统提供给应用程序进行网络通信的一套标准函数或方法。不同的操作系统(Windows, Linux, macOS)都会提供Socket API的实现(例如Berkeley Sockets API、Windows Sockets API)。
    • 它确实封装了TCP/IP协议栈的复杂性。开发者通过调用Socket API(如socket()​, bind()​, listen()​, accept()​, connect()​, send()​, recv()​等函数),就可以进行网络数据的发送和接收,而不需要直接处理TCP/IP的报文头、三次握手、四次挥手等底层细节。
  • 层面:Socket API工作在传输层和应用层之间,是应用层程序使用传输层服务(主要是TCP和UDP)的门户。

  • 灵活性:Socket API可以用来实现任何基于TCP或UDP的上层应用协议。例如,HTTP服务器、FTP服务器、SMTP服务器等,它们的底层网络通信都是通过Socket来实现的。

所以,可以把Socket想象成墙上的“网络插座”:

  • 操作系统提供了这个“插座”(Socket API)。
  • 应用程序(如浏览器、服务器程序)制作一个“插头”(创建Socket实例),插到这个“插座”上。
  • 通过这个“插座”,应用程序就可以接入网络,发送和接收电流(数据)。

WebSocket:基于TCP的应用层“持久化”通信协议

WebSocket是在HTML5时代应运而生的一种全新的、独立的、基于TCP的应用层协议。

  • 目的:

    • 解决HTTP协议在某些场景下的局限性,特别是实现浏览器与服务器之间的全双工、持久化通信。
    • 你提到“解决HTTP不支持持久化连接问题”,这里需要稍微精确一下。HTTP/1.1引入了持久连接 (Keep-Alive),允许在一次TCP连接上发送多个HTTP请求和响应,避免了每个请求都重新建立TCP连接的开销。但是,这种持久连接本质上还是客户端请求-服务器响应模式,服务器不能主动向客户端推送数据,除非使用一些“hack”手段(如轮询、长轮询、SSE)。
  • 握手过程:

    • WebSocket连接的建立过程很巧妙,它始于一个HTTP请求。客户端会发送一个特殊的HTTP GET请求(包含Upgrade: websocket​、Connection: Upgrade​等头部)。
    • 如果服务器支持WebSocket,它会响应一个HTTP 101 Switching Protocols的状态码,表示同意“升级”到WebSocket协议。
    • 一旦握手成功,底层的TCP连接就不再用于HTTP通信,而是转为WebSocket协议的专用通道。
  • 核心特性:

    • 全双工 (Full-duplex):一旦连接建立,客户端和服务器双方可以同时、独立地向对方发送数据,无需等待对方响应。这与HTTP的请求-响应模式有本质区别。
    • 持久化连接 (Persistent Connection):WebSocket连接一旦建立,会保持打开状态,直到一方明确关闭或发生网络故障。这避免了HTTP(即使是Keep-Alive)在需要频繁双向通信时,仍可能存在的延迟和头部开销。
    • 较低的头部开销:WebSocket数据帧的头部非常小(通常只有2-10字节),相比HTTP请求/响应头部(可能几百字节甚至上千字节)要小得多,大大减少了网络流量。
    • 基于事件驱动:客户端和服务器通过监听事件(如onopen​, onmessage​, onclose​, onerror​)来处理连接状态和数据收发。
  • 应用场景:

    • 实时聊天室、在线游戏、股票行情实时推送、协作编辑工具、体育赛事比分直播等需要低延迟、高频率双向数据交互的Web应用。