TCP和UDP
TCP
TCP协议全称是传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议,由 IETF 的RFC 793定义。TCP 是面向连接的、可靠的流协议。流就是指不间断的数据结构,你可以把它想象成排水管中的水流。
三次握手
-
第一次握手:客户端向服务端发送连接请求报文段。该报文段中包含自身的数据通讯初始序号。请求发送后,客户端便进入 SYN-SENT 状态。 -
第二次握手:服务端收到连接请求报文段后,如果同意连接,则会发送一个应答,该应答中也会包含自身的数据通讯初始序号,发送完成后便进入 SYN-RECEIVED 状态。 -
第三次握手:当客户端收到连接同意的应答后,还要向服务端发送一个确认报文。客户端发完这个报文段后便进入 ESTABLISHED 状态,服务端收到这个应答后也进入 ESTABLISHED 状态,此时连接建立成功。 这里可能大家会有个疑惑:为什么 TCP 建立连接需要三次握手,而不是两次?这是因为这是为了防止出现失效的连接请求报文段被服务端接收的情况,从而产生错误。
四次挥手
为什么握手不是2次或者4次,而选择3次
四次握手的过程:
- A发送同步信号SYN + A’s Initial sequence number
- B确认收到A的同步信号,并记录A’s ISN到本地,命名B’s ACK sequence number
- B发送同步信号SYN + B’s Initial sequence number,
- A确认收到B的同步信号,并记录B’s ISN到本地,命名A’s ACK sequence number
很显然1.2和1.3这两个步骤可以合并,只需要三次握手,可以提高连接的速度与效率。
二次握手的过程:
- A发送同步信号SYN + A’s Initial sequence number
- B发送同步信号SYN +B’s Initial sequence number + B’s ACK sequence number
这里有一个问题, A与B就A的初始序列号达成了一致,这里是1000,但是B无法知道A是否已经接收到自己的同步信号,如果这个同步信号丢失了, A和B就B的初始序列号将无法达成一致。 于是TCP的设计者将SYN这个同步标志位SYN设计成占用一个字节的编号(FIN标志位也是) ,既然是一个字节的数据,按照TCP对有数据的TCP segment必须确认的原则,所以在这里A必须给B一个确认,以确认A已经接收到B的同步信号。
UDP
UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。
TCP和UDP各自的特点与应用场景
| UDP | TCP |
---|
是否连接 | 无连接 | 面向连接 | 是否可靠 | 不可靠传输,不使用流量控制和拥塞控制 | 可靠传输,使用流量控制和拥塞控制 | 连接对象个数 | 支持一对一,一对多,多对一和多对多交互通信 | 只能是一对一通信 | 传输方式 | 面向报文 | 面向字节流 | 首部开销 | 首部开销小,仅8字节 | 首部最小20字节,最大60字节 | 适用场景 | 适用于实时应用(IP电话、视频会议、直播等) | 适用于要求可靠传输的应用,例如文件传输 |
|