首先我们要清楚tcp和udp都是位于OSI七层模型中的传输层协议,网络层在提供了主机到主机之间的逻辑通道后,而传输层则是建立主机上端到端的连接。
连接上:
TCP
TCP协议提供有连接的方式,既需要三次握手建立连接,四次挥手断开连接。
三次握手建立连接:
看下图
CLOSED状态:既关闭状态,此刻可以建立连接。
SYN_SENT状态:请求方在发送SYN标志位,和seq序列后,由CLOSED状态变为SYN_SENT状态。
SYN_RCVD状态:接收方在接收到请求方发来的seq后,进行确认,以及发送自己的SYN标志位和ACK标志位之后,由CLOSED状态变为SYN_RCVD状态。
ESTABLISHED状态:既连接建立成功后,所处的状态。发送方则是在发送ACK标志位,seq,ack后由SYN_SENT状态变为ESTABLISHED状态,接收方则是在接收到发送方的ACK标志位,seq,ack后由SYN_RCVD状态变为ESTABLISHED状态
四次挥手结束连接:
如下图:
FIN_WAIT1状态:由主动关闭的那一方,在发送FIN标志位,以及seq序列号后,由ESTABLISHED状态进入FIN_WAIT1状态。
CLOSE_WAIT状态:由被动关闭那一方,在接收到发送方发来的FIN报文,然后发送ACK报文确认后,由ESTABLISHED状态进入CLOSE_WAIT状态。
FIN_WAIT2状态:由主动关闭的那一方,在接收到接收方发来的ACK报文后,由FIN_WAIT1状态进入FIN_WAIT2状态。此状态下,处于半关闭状态,此时主动关闭方,已经不能在主动给接收方发送数据了,但是可以接收被动关闭方发来的数据。
LAST_ACK状态:由被动关闭那一方,发送FIN报文后,由CLOSE_WAIT状态进入LAST_ACK状态。
TIME_WAIT状态:由主动关闭的那一方,在接收到被动关闭方传来的FIN报文,然后发送ACK报文给接收方之后,由FIN_WAIT2状态进入TIME_WAIT状态。并且进入改状态后,会等待2MSL时间后,如果没有异常的话,则会自动进入CLOSED状态。
为什么等待2MSL时间?
首先我们要清楚,MSL]指的是最大报文生存时间(Maximum Segment Lifetime),它表示一个 TCP 报文在网络中能够存在的最长时间,通常以秒为单位。
确保可靠的连接关闭
TIME-WAIT 状态确保了连接的彻底关闭。在此状态下,连接的一方等待一段时间,以确保对方已经收到了连接关闭的确认信息。这样可以避免在关闭连接后,残留的数据包继续在网络中传输,从而确保了连接的可靠性和完整性。
防止新旧连接之间的混淆
TIME-WAIT 状态还有助于防止新的连接与旧的连接之间发生混淆。在该状态下,操作系统会保留连接的端口一段时间,以避免新的连接使用相同的端口号与之前的连接产生冲突。这样可以确保新连接不会错误地接收到之前连接的残留数据,从而保证了网络通信的可靠性和正确性。
UDP
UDP协议则提供无连接的方式,既不需要提前与要通信的设备建立连接,而是直接发送数据和接受数据。简单来说就是“发送既结束”。从而达到开销小,性能高的特点。
但是由于这种方式的通信,很容易出现丢包的现象,从而导致不可靠,安全性差的缺点。
传播方式上:
TCP:
tcp协议由于需要建立连接,因此只能实现点到点两者之间的传输,既单播传输。
UDP:
udp协议因为不需要建立连接,直接发送和接收数据即可,因此可以将一个数据包同时发送给多个接收者,而一个接收者也可以接收多个发送者发来的数据包,因此支持一对一,一对多,多对一,多对多的传输方式。
数据包传输方式上:
TCP:
面向字节流的,如果单个数据包过小,则会将多个数据包组合在一起,如果单个数据包过大,则会拆分成小一点的数据包,以字节流的方式进行数据传输。因此接收方,还需要处理接受到的数据包,进行解析。
UDP:
面向报文的,既会将数据包既不合并也不拆分,而是一个一个的发送给接收方。
是否可靠:
TCP:
可靠传输协议,因为tcp协议通过建立连接,确认应答,超时重传,滑动窗口等机制,实现可靠传输
UDP:
不可靠传输协议,因为udp协议不建立连接,只管数据包的发送和接收,对于丢包,堵塞等问题,在传输层并不考虑,从而导致不可靠传输