TCP/IP、HTTP、Socket、WebSocket 的区别

一个主动套接字只能建立一个连接(默认分配5位数端口)

服务器是用 fd(文件描述符)识别客户端连接的,所以一个端口就可以处理 N 个客户端连接。

物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
IP 协议对应于网络层,TCP 协议对应于传输层,而 HTTP 协议对应于应用层

// 升级到 websocket 之后新建连接,发送 websocket 帧?
WebSocket 是一个新协议,基于 TCP,跟 HTTP 协议基本没有关系,只是为了兼容现有浏览器的握手规范以及使用 HTTP 进行连接而已,有主动性(实时),解决重复连接的资源浪费的情况。可以跨域(因为 WebSocket 的客户端不仅仅局限于浏览器,因此 WebSocket 规范没有规范 Origin 必须相同),但不能在 https 中使用 ws服务器要做限制和验证(利用请求头,socket中获取ip等, 避免ws请求伪造)。
WebSocket 设计者为了安全的特意设计,以"Sec-"开头的 Header 可以避免被浏览器脚本读取到,这样攻击者就不能利用 XMLHttpRequest 伪造 WebSocket 请求来执行跨协议攻击,因为 XMLHttpRequest 接口不允许设置 Sec-开头的 Header。

TPC/IP 协议是传输层协议,主要解决数据如何在网络中传输,而 HTTP 是应用层协议,主要解决如何包装数据

Socket 则是对 TCP/IP 或 UDP/IP 协议的封装和应用(程序员层面上),Socket 本身并不是协议,而是一个调用接口(API),是对TCP/IP 协议的抽象,从而形成了我们知道的一些最基本的函数接口,比如 create、listen、connect、accept、send、read 和 write 等等。

TCP 连接的三次握手建立连接时,需要客户端和服务器总共发送3个包
第一次握手:客户端发送 SYN 包(syn=j)到服务器,并进入 SYN_SEND 状态,等待服务器确认;
第二次握手:服务器收到 SYN 包,必须确认客户的 SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态;
第三次握手:客户端收到服务器的 SYN+ACK 包,向服务器发送确认包 ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED 状态,完成三次握手。

三次握手完毕后,客户端与服务器才正式开始传送数据,TCP一旦建立,一直保持,直到任何一方主动关闭连接(节省握手)

三次握手的目的是连接服务器指定端口,建立 TCP 连接,并同步连接双方的序列号确认号并交换 TCP 窗口大小信息;防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误"

TCP 的连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)

HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应。从建立连接到关闭连接的过程称为"一次连接"。
1.1 默认 keep-alive,最后收到close 才关闭tcp链接
1.1 版引入了管道机制(pipelining),即在同一个TCP连接里面,客户端可以同时发送多个请求,限制:服务器必须以接收请求的相同顺序发送其响应,大多数浏览器没有默认启用
一个TCP连接现在可以传送多个回应,Content-length区分数据包是属于哪一个回应的(另外方式使用分块机制,最后是一个大小为0的块)
有了Host字段,就可以将请求发往同一台服务器上的不同网站,为虚拟主机的兴起打下了基础。
虽然1.1版允许复用TCP连接,但是同一个TCP连接里面,所有的数据通信是按次序进行的。服务器只有处理完一个回应,才会进行下一个回应。要是前面的回应特别慢,后面就会有许多请求排队等着。这称为"队头堵塞"(Head-of-line blocking)。

TCP 是面向链接的,UDP 传送数据前并不与对方建立连接,UDP 是无连接的、不可靠的一种数据传输协议(QUIC协议有补充)。

UDP 的实时性更好