一.TCP协议
以上是TCP的头部信息:
-
首先是源端口和目的端口
-
接着是数据包的序号,对各个包编号解决了数据包乱序的问题,也用于丢包重发
-
然后是数据包的确认号,如果数据包丢失就进行重发,保证了不丢包
-
接下来是标志位
URG:紧急,0x20。当URG=1时,表示报文段中有紧急数据,应尽快传送。 ACK:确认,0x10。当ACK = 1时,代表这是一个确认的TCP包,取值0则不是确认包。 PSH:推送,0x08。当发送端PSH=1时,接收端尽快的交付给应用进程。 RST:复位,0x04。当RST=1时,表明TCP连接中出现严重差错,必须释放连接,再重新建立连接。 SYN:同步,0x02。在建立连接是用来同步序号。SYN=1, ACK=0表示一个连接请求报文段。SYN=1,ACK=1表示同意建立连接。
FIN:终止,0x01。当FIN=1时,表明此报文段的发送端的数据已经发送完毕,并要求释放传输连接。
-
还有就是窗口,用来控制对方发送的数据量,通知发放已确定的发送窗口上限,简单来说就是控制流量
TCP三次握手
TCP三次握手是TCP协议的重要内容,它主要解决维护连接的问题。
第一次握手:客户端发送TCP包,置SYN标志位为1,将初始序号X,保存在包头的序列号(Seq)里。
第二次握手:服务端回应确认包,置SYN标志位为1,置ACK为X+1,将初始序列号Y,保存在包头的序列号里。
第三次握手:客户端对服务端的确认包进行确认,置ACK为Y+1。
如果TCP是两次握手,那么客户端在发送给服务端请求连接的请求后,服务端返回确认连接,但可能客户端早早的关闭了连接或者网络存在问题,此时客户端断开了连接,但服务端还保持与客户端的连接,这就造成了资源的浪费,如果这样的连接过多,就造成服务端的崩溃。
TCP四次挥手
- 这里主动方A要关闭连接,发送了包含FIN和ACK标志的请求给B
- B确认了A的请求,返回了ACK的ACK
- 这是其实连接可以断开了,但可能B还有未完的数据要发送给A,因此B在发送完剩余的数据后也需要主动的关闭连接,这时B发送了包含FIN和ACK标志的请求给A
- A确认了B的请求,返回了ACK的ACK,最终连接关闭
二.UDP协议
UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。
UDP协议的头部和TCP的头部相比起来少了很多,比如数据包的序号、确认号、表明状态的标志位等等,少了这些因素的UDP表明了UDP协议在数据传输中是不可靠的。
三.TCP和UDP的区别
TCP | UDP | |
---|---|---|
是否可靠传输 | 可靠传输 | 不可靠传输 |
头部开销 | 头部开销大,占20字节 | 头部开销小,占8字节 |
是否连接 | 面向连接 | 无连接 |
适用场景 | 要求数据可靠传输的场景,例如文件下载等 | 实时要求高的场景,例如直播、游戏等 |
总的来说,在数据传输的过程中传输的速度和数据的准确性不可兼得,要根据具体的场景进行选择。