1.TCP 协议
Transmission Control Protocol,传输控制协议
1)特点
①TCP是面向连接的运输层协议,支持端到端通信。
所谓面向连接就是双方传输数据之前,必须先建立一条通道,例如三次握手就是建立通道的一个过程,而四次挥手则是结束销毁一个通道的过程。
②每一条TCP连接只能有两个端点,只能是点对点的。
③进行必要流量控制,避免发包过快而导致阻塞。
④TCP提供可靠的传输服务,进行无差错控制;传送的数据不丢失、不重复、按序到达。
⑤TCP提供全双工通信;允许通信双方的应用进程在任何时候都可以发送数据,因为两端都设有发送缓存和接受缓存。
⑥面向字节流。虽然应用程序与TCP交互是一次一个大小不等的数据块,但TCP把这些数据看成一连串无结构的字节流,它不保证接收方收到的数据块和发送方发送的数据块具有对应大小关系。
2.UDP 协议
User Datagram Protocol,用户数据报协议
1.特点
UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地, 一个数据报包在运输中可能丢失。
由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。
①UDP是无连接的传输层协议;
②UDP尽最大努力交付,不保证可靠交付, 可靠性由上层协议保证。
③UDP是面向报文的,对应用层交下来的报文不合并,不拆分,保留原报文的边界;
④UDP没有拥塞控制,因此即使网络出现拥塞也不会降低发送速率;
⑤UDP是一对一,一对多,多对多的交互通信;
⑥UDP的首部开销小,只有8字节。
TCP和UDP有什么区别?
- 面向连接:
TCP
协议需要建立连接,仅支持一对一通信;UDP
协议无需建立连接,支持一对一、一对多、多对一和多对多的交互通信。 - 可靠传输:
TCP
协议通过确认应答、连接管理、流量控制、拥塞控制来确保可靠性传输;UDP
不保证可靠性传输。 - 性能效率:
TCP
协议传输效率慢,需要较多的资源开销。UDP
协议传输效率快,需要较少的资源开销。 - 首部格式:
TCP
协议的首部需要20-60
个字节,UDP
协议需要8个字节。
谈谈TCP协议的3次握手过程?
TCP
协议通过3
次握手,建立服务器 Server
与 客户端 Client
之间的TCP
连接:
- 第一次握手:
-
- 客户端先向服务器发送一个
TCP
数据包,首部格式内容为:SYN=1,ACK=0
,表示这是一个请求建立连接的数据包。
- 客户端先向服务器发送一个
- 第二次握手:
-
- 服务器收到客户端发送的第一个数据包后,根据
SYN=1
与ACK=0
,判断出为主动请求建立连接的数据包。 - 若服务器同意连接,则服务器向客户端发送一个数据包进行回应,首部格式内容为:
SYN=1,ACK=1
。ACK=1
代表服务器同意连接。
- 服务器收到客户端发送的第一个数据包后,根据
- 第三次握手:
-
- 客户端收到服务器的确认之后,再给服务器发送一个数据包,首部格式内容为:
SYN=0,ACK=1
。SYN=0
代表双方已同意建立连接,ACK=1
代表客户端收到服务器的确认数据包。
- 客户端收到服务器的确认之后,再给服务器发送一个数据包,首部格式内容为:
谈谈TCP协议的四次挥手过程?
- 第一次挥手:
- 首先客户端向服务器发送连接释放的请求数据包,并停止发送数据。首部格式内容为:
FIN=1,ACK = 0
FIN=1
,意味着客户端要主动释放客户端—>
服务器的TCP
连接。
- 首先客户端向服务器发送连接释放的请求数据包,并停止发送数据。首部格式内容为:
- 第二次挥手:
- 服务器收到连接释放的报文之后,给客户端发送确认数据包,首部格式内容为:
FIN=0,ACK=1
。 ACK=1
表示服务器收到了客户端发送的数据包,同意客户端释放连接;- 通过第二次挥手,客户端到服务器方向的连接就释放了,
TCP
连接处于半关闭状态。此时客户端无法发送数据给服务器,但是服务器还可以发送数据给客户端,客户端仍可以接收。
- 服务器收到连接释放的报文之后,给客户端发送确认数据包,首部格式内容为:
- 第三次挥手:
- 若服务器已经没有向客户端发送的数据了,其应用进程就通知
TCP
释放连接,并向客户端发送确认报文。首部格式内容为:ACK=1,FIN=1
- 确认
ACK=1
,表示服务器已经把需要发给客户端的数据发完了; - 终止
FIN=1
,表示服务器要释放服务器—>
客户端的TCP
连接; - 此时,服务器不再向客户端发送数据,但能接收数据。
- 若服务器已经没有向客户端发送的数据了,其应用进程就通知
- 第四次挥手:
- 客户端收到服务器的连接释放报文段后,向服务器发出确认报文。首部格式内容为:
ACK=1,FIN = 0
- 确认
ACK=1
,表示收到服务器的确认报文,并同意服务器释放连接; -
- 客户端收到服务器的连接释放报文段后,向服务器发出确认报文。首部格式内容为:
流量控制是为了控制发送方发送速率,保证接收方来得及接收。
TCP
连接的每一方都有固定大小的缓冲空间,TCP
的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失,从而实现流量控制。
TCP
使用的流量控制协议是可变大小的滑动窗口协议。 (即TCP 利用滑动窗口实现流量控制)
接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。
滑动窗口是TCP
协议用于实现流量控制的一种机制。
发送方和接收方分别维护各自的缓冲区,这个缓冲区就是窗口。发送方的窗口大小由接收方的TCP
首部的窗口字段决定。
发送方将窗口内容分为:已发送并确认,已发送未确认,未发送未超出接收方窗口范围,未发送但超出接收方窗口范围。随着接收方的确认,发送方将不断在窗口内向前滑动。
接收方将窗口内容分为:接受已确认,未收到但可以接受。接收方读取窗口内容,并不断确认通知发送方,窗口向前滑动。接收方通过改变窗口大小,可以控制发送方的速率,从而实现流量控制。
发送方需要维护一个叫做拥塞窗口(cwnd
)的状态变量,来决定发送方可以同时发送多少数据包。数据包的数量多与少,将决定网络中产生拥塞的可能性大与小。TCP
主要通过四个算法来进行拥塞控制:慢开始、拥塞避免、快重传、快恢复。
慢开始:拥塞窗口从1
开始,采用加倍计算方式,由小到大逐渐增大。
拥塞避免:慢开始每个轮次都将 cwnd
加倍,这样会让 cwnd
增长速度非常快,从而使得发送方发送的速度增长速度过快,网络拥塞的可能性也就更高。设置一个慢开始门限 ssthresh
,当 cwnd >= ssthresh
时,进入拥塞避免,每个轮次只将 cwnd
加 1,降低拥塞窗口的增长速度。
快重传:在接收方,要求每次接收到报文段后,都应该对最后一个已收到的报文段进行确认,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段。
快恢复:快恢复是配套快重传使用,当执行快重传时,就执行“乘法减小(ssthresh × 0.5
)”算法,把慢开始门限 ssthresh
减半,同时执行拥塞避免,使拥塞窗口缓慢地线性增大。