一、 TCP与UDP的区别
1. 相同点
都是属于传输层的协议
2. 不同点
TCP | UDP | |
---|---|---|
1 | 基于连接,可靠性强 | 基于无连接,可靠性较低 |
2 | 需要三次握手、重新确认等过程,实时性很差,同时过程复杂,易于被攻击 | 无连接,因而实时性很强,稍微安全点 |
3 | 在传输相同大小的数据时,报头20字节,而且tcp无丢包,开销很大 | 在传输相同大小的数据时,udp首部开销只有8个字节,而且udp经常丢包,开销很小 |
4 | 每条tcp连接只能是点到点的 | udp支持一对一、一对多、多对一、多对多的交互通信 |
5 | 名叫传输控制协议,传输效率低,可靠性强 | 名叫用户数据报协议,适用于传输可靠性要求不高,数据量小的数据 |
二、 TCP的三次握手
TCP有些名词需要解释一下,以便理解
1. 名词解释
SYN: 同步序列号,用来发起一个连接,SYN=1的报文不能携带数据,但是消耗掉一个序列
ACK: 确认标识,当ACK=1时确认字段才有效
seq: 序列号,即数据包本身的序列号,为连接以后传输数据使用
ack: 对收到数据包的确认,值是等待接受的数据包的序列号(就是期望对方继续发送的那个数据包的序列号)
2. 握手过程
第一次: 客户端C向服务端S发送连接请求报文,该报文首部中的SYN = 1,ACK = 0,随机选取一个序列号seq = i 作为初始序列号,
此时客户端进入SYN_SEDN同步已发送状态。
第二次: 服务端收到客户端的连接请求报文,如果同意建立连接,则发送确认报文,确认报文首部中的SYN = 1 , ACK = 1 ,
ack = i + 1 ,seq = j (服务端的初始序列号),此时,服务器进入SYN_RCVD同步收到状态。
第三次: 客户端收到服务端的确认报文后,会向服务器发送确认报文,告诉服务器收到它的确认报文并准备建立连接,确认报文首部中SYN = 0、
ACK = 1、ack = j + 1、 seq = i + 1。服务端收到客户端确认报文,此时,服务端进入ESTABLISHED已建立连接状态。
3. TCP为什么采用三次握手,而不是两次或四次握手
TCP三次握手的目的是同步连接双方的序列号和确认号,并交换TCP窗口大小信息
为什么采用三次握手: 为了防止失效的请求报文段被服务端接受,从而产生错误。
三、 TCP的四次挥手(释放)
一方主动关闭,另一方被动关闭
第一次:客户端C发送一个FIN,用来关闭客户端C到服务端S的数据传送,客户端C进入FIN-WAIT-1状态
第二次:服务端S收到FIN后,发送一个ACK给客户端C,确认序列号为收到序列号+1,服务端S进入CLOSE-WAIT
第三次:服务端S发送一个FIN,用来关闭服务端S到客户端C的数据传送,服务端S进入LAST-ACK
第四次:客户端C收到FIN后,客户端C进入TIME-WAIT状态,接着发送一个ACK给服务端S,
确认序列号为收到序列号+1,服务端S进入CLOSE状态,完成第四次挥手。