TCP(传输控制协议)通过多种机制确保数据的可靠传输,以下是其核心机制及工作原理:
1. 三次握手建立连接
- 目的:确保双方通信能力正常,同步初始序列号(ISN)。
- 过程:
- 客户端发送
SYN
(同步序列号)报文。 - 服务端回复
SYN-ACK
(确认+同步)。 - 客户端发送
ACK
确认。
- 客户端发送
- 作用:避免历史重复连接导致的资源浪费,为后续数据传输奠定基础。
2. 数据分块与序列号
- 分块(Segmentation):将数据分割为适合传输的MSS(最大报文段大小)。
- 序列号(Sequence Number):每个字节分配唯一序列号,标识数据顺序。
- 作用:接收方按序列号重组数据,解决乱序或重复问题。
3. 确认应答(ACK)与超时重传
- ACK机制:接收方收到数据后,发送
ACK
确认(值为期望收到的下一个序列号)。- 示例:发送序列号1-1000的数据,接收方回复
ACK 1001
。
- 示例:发送序列号1-1000的数据,接收方回复
- 超时重传:
- 发送方未收到
ACK
时,启动重传计时器(RTO动态调整)。 - 超时后重发数据,多次失败则断开连接。
- 发送方未收到
4. 滑动窗口与流量控制
- 滑动窗口:发送方维护一个窗口,允许连续发送多个报文段(无需逐个等待
ACK
)。- 窗口大小:由接收方通过
TCP头部
的窗口字段
动态通知(流量控制)。
- 窗口大小:由接收方通过
- 流量控制:防止接收方缓冲区溢出。若缓冲区满,窗口大小设为0,发送方暂停发送(通过零窗口探测保持同步)。
5. 拥塞控制
- 目的:避免网络过载,动态调整发送速率。
- 核心算法:
- 慢启动:窗口从1开始指数增长,直到阈值(
ssthresh
)。 - 拥塞避免:窗口线性增长,避免激进发送。
- 快重传:收到3个重复
ACK
时立即重传(无需等待超时)。 - 快恢复:重传后窗口降为阈值,进入拥塞避免阶段。
- 慢启动:窗口从1开始指数增长,直到阈值(
6. 四次挥手释放连接
- 过程:
- 主动方发送
FIN
。 - 被动方回复
ACK
(半关闭状态)。 - 被动方发送
FIN
。 - 主动方回复
ACK
,进入TIME_WAIT
状态(等待2MSL确保最后一个ACK
到达)。
- 主动方发送
- 作用:确保双方资源释放,处理延迟报文。
7. 其他辅助机制
- 校验和:通过CRC校验检测数据损坏,丢弃错误报文(触发重传)。
- 选择性确认(SACK):允许接收方告知缺失的数据块,减少不必要的重传。
总结
TCP通过连接管理、序列号、确认重传、滑动窗口、拥塞控制等机制,在不可靠的IP层上实现了:
状态码 | 定义 |
---|---|
1xx 报告 | 接收到请求,继续进程 |
2xx 成功 | 步骤成功接收,被理解,并被接受 |
3xx 重定向 | 为了完成请求,必须采取进一步措施 |
4xx 客户端出错 | 请求包括错的顺序或不能完成 |
5xx 服务器出错 | 服务器无法完成显然有效的请求 |
403: Forbidden
一、OSI,TCP/IP,五层协议的体系结构,以及各层协议
OSI分层 (7层):物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
TCP/IP分层(4层):网络接口层、 网际层、运输层、 应用层。
五层协议 (5层):物理层、数据链路层、网络层、运输层、 应用层。
TCP三次握手
- 第一次握手🤝: 客户端向服务器发出连接请求报文,这时报文首部中的同部位SYN=1,同时随机生成初始序列号 seq=x,此时,客户端进程进入了 SYN-SENT状态,等待服务器的确认。
- 第二次握手🤝: 服务器收到请求报文后,如果同意连接,则发出确认报文。确认报文中应该 ACK=1,SYN=1,确认号是ack=x+1,同时也要为自己随机初始化一个序列号 seq=y,此时,服务器进程进入了SYN-RCVD状态,询问客户端是否做好准备。
- 第三次握手🤝: 客户端进程收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=y+1,此时,连接建立,客户端进入ESTABLISHED状态,服务器端也进入ESTABLISHED状态。
为什需要三次,两次不行吗?
假如现在客户端想向服务端进行握手,它发送了第一个连接的请求报文,但是由于网络信号差或者服务器负载过多,这个请求没有立即到达服务端,而是在某个网络节点中长时间的滞留了,以至于滞留到客户端连接释放以后的某个时间点才到达服务端,那么这就是一个失效的报文,但是服务端接收到这个失效的请求报文后,就误认为客户端又发了一次连接请求,服务端就会想向客户端发出确认的报文,表示同意建立连接。 假如不采用三次握手,那么只要服务端发出确认,表示新的建立就连接了。但是现在客户端并没有发出建立连接的请求,其实这个请求是失效的请求,一切都是服务端在自相情愿,因此客户端是不会理睬服务端的确认信息,也不会向服务端发送确认的请求,但是服务器却认为新的连接已经建立起来了,并一直等待客户端发来数据,这样的情况下,服务端的很多资源就没白白浪费掉了。 采用三次握手的办法就是为了防止上述这种情况的发生,比如就在刚才的情况下,客户端不会向服务端发出确认的请求,服务端会因为收不到确认的报文,就知道客户端并没有要建立连接,那么服务端也就不会去建立连接,这就是三次握手的作用
TCP断联四次挥手
- 第一次挥手👋: 客户端进程发出连接释放FIN报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=x,此时,客户端进入FIN-WAIT-1(终止等待1)状态。
- 第二次挥手👋: 服务端进程收到连接释放FIN报文,发出确认ACK报文,ACK=1,ack=x+1,并且带上自己的序列号seq=y,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。此时,服务端通知高层的应用进程,客户端向服务端的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务端若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。客户端收到服务端的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文,在这之前依然可以接收服务端发送过来的最后的数据。
- 第三次挥手👋: 服务端将最后的数据发送给客户端完成后,就向客户端发送连接释放FIN报文,FIN=1,ack=x+1,此时的序列号为seq=z,此时,服务端就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
- 第四次挥手👋: 客户端接收到服务端的连接释放FIN报文后,必须发出确认报文,ACK=1,ack=z+1,而自己的序列号是seq=x+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。此时服务端收到客户端发送过来的确认报文,就立即撤销自己的传输控制块TCB,进入CLOSED状态,注意此时的TCP连接还没有释放,必须经过2MSL(最长报文段寿命)的时间后,客户端没有收到服务端发来的任何数据,证明服务端已正常关闭,此时客户端会撤销相应传输控制块TCB后,进入CLOSED状态。至此,TCP的连接才真正的断开了。(服务端结束TCP连接的时间要比客户端稍微早一些)
为什么TIME_WAIT状态还需要等2*MSL(Max SegmentLifetime,最大分段生存期)秒之后才能返回到CLOSED状态呢?
因为虽然双方都同意关闭连接了,而且握手的4个报文也都发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SENT状态到ESTABLISH状态那样),但是我们必须假想网络是不可靠的,你无法保证你最后发送的ACK报文一定会被对方收到,就是说对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文。
什么是二层与三层交换机?
通常情况下,OSI模型分为七层:应用层,表示层,会话层,传输层,网络层,数据链路层和物理层。
二层交换机工作于OSI模型的二层(数据链路层),故而称为二层交换机,主要功能包括物理编址、错误校验、帧序列以及流控。 而三层交换机位于三层(网络层),是一个具有三层交换功能的设备,即带有三层路由功能的二层交换机,但它是二者的有机结合,并不是简单地把路由器设备的硬件及软件叠加在局域网交换机上。