上一篇👉: 前端开发之性能优化
CLOSED
状态,表明没有活动的连接。LISTEN
状态,等待连接请求。ISN_c
),并向服务器发送一个SYN标志置位的报文段。这标志着客户端试图建立连接,此时客户端状态变为SYN_SENT
,表示客户端正在等待服务器的确认。SYN
报文,如果同意连接,会生成自己的初始序列号(ISN_s
),并将ISN_c + 1
作为确认号(Acknowledgment Number
)包含在回应报文中,同时设置SYN
和ACK
标志位。服务器状态变为SYN_RECEIVED
,表示服务器已发送了SYN+ACK
且等待客户端的最后确认。SYN+ACK
报文后,会向服务器发送一个ACK
报文作为应答,确认号设置为ISN_s + 1
。此时,客户端进入ESTABLISHED
状态,表示连接已经建立,可以开始传输数据。服务器在收到这个ACK
后,也会进入ESTABLISHED
状态。此时,双方以建立起了链接。序列号(ISN)的动态性:ISN
的动态生成是为了防止单纯递增的序列号被预测,增强连接的安全性,防止重放攻击。
数据携带问题:三次握手中,前两次握手主要用于连接的建立和确认,不携带数据以最小化初始连接建立的复杂性,防止恶意利用。第三次握手时,理论上客户端可以携带数据,因为连接已基本建立,但实践中通常不这么做,以减少网络拥塞和重传风险。
半连接队列与全连接队列:这是服务器端的两种队列管理机制,用以应对连接请求的处理压力。半连接队列存储了处于SYN_RECEIVED
状态的连接请求,全连接队列则存储了已完成三次握手的连接。队列的大小配置影响着服务器对并发连接的处理能力。
SYN-ACK重传:这一机制体现了TCP
的健壮性,通过逐步延长的重传时间间隔,有效平衡了连接建立的效率与资源消耗,防止恶意SYN泛洪攻击。
三次握手的作用
ISN
)。这个序列号在后续的数据传输中用于数据包的排序和确认,保证数据包按序到达且无遗漏。MSS
),选择性确认(SACK
)等选项,为后续的数据传输优化条件。SYN+ACK
,服务器就不会为这个连接分配过多资源。TLS
握手)奠定了基础,确保双方准备好进行安全的数据交换。总之,三次握手是一个精心设计的过程,旨在建立一个稳定、可靠、且双方都已准备好的通信环境,为后续的数据传输打下坚实的基础。
四次挥手是TCP连接断开的过程,确保了数据的可靠传输直至连接关闭,具体步骤及状态变迁如下:
FIN_WAIT_1
状态,等待服务器的确认。FIN
报文后,会发送一个ACK
报文作为应答,确认序列号为客户端FIN
报文的序列号加1,表明服务器已收到关闭请求。服务器此时可能还有数据需要发送,因此状态变为CLOSE_WAIT
,即等待应用程序关闭连接并完成数据发送。FIN
报文,请求关闭其方向上的连接。服务器状态变为LAST_ACK
,等待客户端的最终确认。FIN
报文后,发送ACK
报文作为响应,确认序列号同样为服务器FIN
报文的序列号加1。此时,客户端进入TIME_WAIT
状态,等待足够的时间(通常是2倍的最大段生存时间,MSL)以确保服务器收到了ACK
,防止最后的ACK
丢失而需要重新发送FIN
。服务器收到ACK
后,关闭连接,进入CLOSED
状态。ACK
报文不会引起连接的混淆。如果服务器没有收到最后的ACK
,它会重发FIN
,而TIME_WAIT
状态下的客户端能够重新发送ACK
,保证连接的正确关闭。LISTEN
:服务器等待连接请求。SYN_SENT
:客户端已发送SYN,等待服务器确认。SYN_RECEIVED
:服务器接收到SYN,等待客户端的ACK。ESTABLISHED
:连接建立,数据传输可以进行。FIN_WAIT_1
:客户端已发送FIN,等待服务器的ACK。FIN_WAIT_2
:客户端收到服务器的ACK,等待服务器的FIN。CLOSE_WAIT
:服务器接收到FIN,但还未发送自己的FIN。CLOSING
:客户端接收到服务器的FIN,同时自己的FIN也在路上。LAST_ACK
:服务器已发送FIN,等待客户端的最后ACK。TIME_WAIT
:客户端等待足够时间确保最后的ACK被服务器收到。CLOSED
:连接完全关闭,双方均无状态。这一过程确保了连接的双方都能明确知道连接何时关闭,且所有数据都被正确传输,无数据丢失。
GET
通常用于请求服务器发送某个资源,比如请求一个网页或图片。它适合用于获取数据,不应有副作用。POST
用于向服务器提交数据,常用于表单提交、上传文件或创建新资源。它可以包含更多的数据,且对数据格式没有限制。GET
将参数附加在URL
中,作为查询字符串。由于URL长度有限制(通常不超过2048字符),这限制了GET能携带的数据量。POST
将参数放在请求正文中,因此可以传输大量数据,且不显示在URL
中,适合敏感信息的传输。尽管如此,通过网络监控工具仍可能被截获,因此不绝对安全。GET
请求可被浏览器缓存、保存在浏览历史中,且可能在Referrer
头部中暴露给第三方站点。它被认为是安全的,因为它不修改服务器状态。安全的方法除了 GET
之外还有:HEAD
、OPTIONS
。POST
的目的是传送实体主体内容,经常用于提交数据到服务器,可能涉及数据的创建或修改,比如向数据库插入一条新的记录,因此具有改变服务器数据或状态的能力。这种潜在的改变状态的特性使得POST不被视为安全方法。。不安全的方法除了 POST 之外还有 PUT、DELETE。GET
是幂等的,多次请求具有相同效果,不会产生额外的副作用。POST
不是幂等的,多次请求可能导致多次资源创建或其他副作用。GET
请求默认可被浏览器和代理服务器缓存,除非通过Cache-Control
或Expires
等头部信息指明不缓存。POST
请求通常不会被缓存,因为它们可能改变服务器状态。GET
和 POST
都可用于Ajax
(异步JavaScript和XML)请求,通过XMLHttpRequest
实现。但两者在发送数据的时机上有别:POST
先发送Header
再发送Data
,而GET则
同时发送Header
和Data
,尽管不同浏览器可能有细微差别。GET和POST各有优势和局限,选择时应考虑数据敏感性、数据量、是否需要幂等性以及缓存需求等因素。GET适合简单数据获取,而POST用于提交数据或执行可能改变服务器状态的操作。
TCP
与UDP
作为传输层的两大协议,各自有着显著的特点和适用场景
TCP
连接的建立需要经过三次握手,确保双方都准备好进行数据传输。UDP
通信不需要预先建立连接,减少了建立连接的开销,但也不保证数据的到达。UDP
头部仅8字节,相比TCP的20字节头部更轻量。TCP
基于一对一的连接,而UDP
可以实现一对多的通信。TCP
提供可靠传输,UDP
不保证数据的可靠到达TCP
是面向连接的,UDP
是无连接的。TCP
是面向字节流,UDP
是面向报文的。TCP
由于校验、确认等机制,传输速度相对较慢,开销较大;UDP
因简单快速,适合对实时性要求高的应用。TCP
适用于文件传输、网页浏览等对数据完整性和准确性要求较高的场景;UDP
适用于实时音视频通信、在线游戏等对实时性要求高,能容忍少量丢包的场景。TCP
的可靠传输基于一系列机制,包括:
这些机制共同保障了
TCP
协议的高可靠性,尽管牺牲了一定的传输效率,但在大多数需要高度可靠性的网络应用中,TCP
是首选的传输协议。
下一篇👉: 前端开发之WebSocket通信