-
传输控制协议(TCP)
- 原理:TCP是一种面向连接的、可靠的传输层协议。它通过三次握手过程建立连接,确保两端通信之前都准备就绪。TCP协议通过序列号、确认应答、窗口控制等机制实现数据的可靠传输、流量控制和拥塞控制。数据被分割成TCP认为最合适发送的“段”,并确保每个数据段都将被对方确认收到,否则将重传这些数据段。
- 特点:
- 可靠性:确保数据无误地从源传输到目的地。
- 有序性:确保数据按照发送的顺序到达接收方。
- 重发控制:未被确认的数据段会被重发。
- 流量控制:通过控制发送方的数据流量来阻止接收方被大量数据淹没。
- 拥挤控制:避免网络中的过度拥塞。
-
用户数据报协议(UDP)
- 原理:UDP是一种无连接的协议,提供了一种非常简单的服务。它不保证数据包的顺序、完整性或数据的重发,也不进行流量控制或拥挤控制。因此,UDP协议能够提供较低的延迟和较少的开销,适用于对实时性要求高的应用,如视频流、在线游戏和语音传输。
- 特点:
- 高效:少量的数据包头开销,处理快速。
- 无连接:发送数据前不需要建立连接。
- 无可靠性保证:不确保数据包的顺序、完整性或防止重复。
- 适用于实时应用:因其低延迟特性而被广泛用于实时通信应用
三次握手的详细过程:
假设两个TCP端点是客户端(Client)和服务器(Server)。
-
第一次握手(客户端 -> 服务器):
- 客户端生成一个初始序列号
seq = x
(这里的x是随机的),并发送一个SYN包(SYN=1, seq=x
)到服务器,请求建立连接。
- 客户端生成一个初始序列号
-
第二次握手(服务器 -> 客户端):
- 服务器收到客户端的SYN包后,需要确认这个包(
ack=x+1
)。同时,服务器也选择自己的一个初始序列号seq = y
并将其发送给客户端,所以这个包是一个SYN-ACK包(SYN=1, ACK=1, seq=y, ack=x+1
)。
- 服务器收到客户端的SYN包后,需要确认这个包(
-
第三次握手(客户端 -> 服务器):
- 客户端接收到服务器的SYN-ACK包后,发送一个ACK确认包(
ACK=1, seq=x+1, ack=y+1
)回服务器,确认号ack
是服务器SYN-ACK包中的seq
号加1。至此,建立连接,可以开始数据传输。
- 客户端接收到服务器的SYN-ACK包后,发送一个ACK确认包(
四次挥手的详细过程:
假设客户端(C)和服务器(S)已建立连接并准备终止它。
-
第一次挥手(客户端 -> 服务器):
- 客户端决定关闭连接,发送一个FIN包(
FIN=1, seq=u
),其中seq=u
是客户端序列号。
- 客户端决定关闭连接,发送一个FIN包(
-
第二次挥手(服务器 -> 客户端):
- 服务器接收到这个FIN包,发送ACK确认包(
ACK=1, seq=v, ack=u+1
),seq=v
是服务器的序列号,ack=u+1
是对客户端FIN的确认。
- 服务器接收到这个FIN包,发送ACK确认包(
-
第三次挥手(服务器 -> 客户端):
- 服务器准备关闭连接,但在关闭前还可能会发送一些数据。当服务器确实完成了数据传输,则发送一个FIN包(
FIN=1, seq=w, ack=u+1
)给客户端,seq=w
是服务器序列号,ack=u+1
是对客户端最后一个ACK的确认。
- 服务器准备关闭连接,但在关闭前还可能会发送一些数据。当服务器确实完成了数据传输,则发送一个FIN包(
-
第四次挥手(客户端 -> 服务器):
- 客户端收到服务器发来的FIN包后,发送一个ACK包(
ACK=1, seq=u+1, ack=w+1
)给服务器,seq=u+1
是客户端序列号,ack=w+1
是对服务器FIN包的确认。
- 客户端收到服务器发来的FIN包后,发送一个ACK包(
在最后一个ACK发送后,客户端会等待一段时间(称为2MSL)来确认服务器收到了这个ACK包,这个状态称为TIME_WAIT状态。在经过这个等候时间之后,客户端关闭连接,如果服务器收到了ACK包,则在收到ACK后直接关闭连接。如果没有收到,则会在超时后重发FIN包。
值得注意的是,序列号seq
是32位的,而每发送一个字节的数据,seq
就会加一,所以这些数字是持续增加的,而不是固定的数值。同理,确认号ack
表示期望收到对方下一个数据包的起始序列号。