1.TCP协议
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。
① 建立连接(三次握手)
第一次握手: 客户端向服务端发起连接时,会发送一个SYN包询问服务器是否可以建立连接,之后客户端会进入SYN-SENT状态,等待服务器确认请求。
第二次握手: 服务端收到了客户端发来的SYN包,并且同意连接,就会向客户端回复一个SYN+ACK包,发送完成后服务端便进入 SYN-RECEIVED 状态。
第三次握手: 客户端收到服务端来的回复后,向服务端发送一个ACK包,之后客户端进入 ESTABLISHED 状态,服务端收到这个应答后也进入ESTABLISHED 状态,此时连接建立成功,三次握手完成。
② 为什么要三次握手呢,两次握手不行吗?
答案当然是不行,因为两次握手在进行第一次握手时,客户端会发送一个SYN包,但这个包可能会出现一些原因导致未能按时到达服务器(滞留),这个时候客户端只能重新发送一个SYN包,这个包顺利到达后,成功建立连接,不过第一个受阻塞的SYN包恢复正常后,还会继续朝服务端发送,服务端会认为这是一个新的请求,会给客户端再次发送一个SYN+ACK包,这就会导致两者状态不一致而出现问题。
如果三次握手出现第一个SYN滞留情况,并且这个SYN包在之后恢复,客户端也不会向服务端发送ACK包,也就是不会进行第三次握手,因为对客户端来说,第一个SYN包已经被抛弃了,我已经重新发一个SYN包并且已经建立了连接,就算服务端以为是要进行一个新连接但我客户端不承认,那肯定就没有了第三次握手的环节,也就不会出现只有两次握手的这种情况。
③ 断开连接(四次挥手)
(此处借了一张图[滑稽])
第一次挥手: 客户端想要释放连接,向服务端发送了一个FIN包,然后进入了FIN_WAIT_1状态。
第二次挥手: 服务端收到请求后,会给客户端发送一个ACK包,进入 CLOSE_WAIT 状态,而客户端进入FIN_WAIT_2状态,这里是告诉客户端不要再往服务端发送数据,但是服务端仍然可以发送未发送完的数据。
第三次挥手: 服务端的数据发送完后,会发送一个FIN包,告诉客户端可以彻底中断这次连接了,这时服务端进入 LAST-ACK 状态。
第四次挥手: 客户端收到了服务端发来的请求后,会返回一个ACK包,告诉服务端自己已经确认了请求,而服务端收到了这个ACK包后,会马上进入CLOSED 状态。 客户端在发送包的同时进入 TIME-WAIT 状态,并等待一段时间,如果这段时间内服务端没有发送数据,就代表服务端已经收到了ACK并进入了关闭状态,客户端也可以安心的进入CLOSED 状态。四次挥手到此结束。
④ TCP的特点
- TCP是面向连接的,它会使用三次握手的方式使客户端和服务端之间建立起连接,能在不可靠的信道上建立起可靠的连接。
- TCP传送数据更加可靠,连接传送的数据无差错,不丢失,不重复,能够按序到达。
- TCP只支持单播传输,只能进行点对点的数据传输,而不是一对多或者是多对一。
- TCP是面向字节流,是以字节流方式进行传输。
- 当网络出现拥塞的时候,TCP能够减小向网络注入数据的速率和数量,缓解拥塞。
2.UDP协议
UDP:用户数据报协议(User Datagram Protocol),它和TCP一样,是传输层通信协议。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。
UDP的特点
- UDP是无连接的,也就是发送数据前不需要先建立起连接,任何时候都可以发送数据。
- UDP不会保证可靠的交付,只是收到什么我就发什么,就算出现了丢包也不会去管。
- UDP面向报文,UDP对应用程序交下来的报文,在添加首部后就向下交付IP层。
- UDP可以实现一对一,一对多,多对一,和多对多的传播方式。
- 首部只有8字节,开销小。
- UDP 因为没有拥塞控制,一直会以恒定的速度发送数据,所以经常容易丢包,但是也更具有实时性,比较适合视频、通话之类的。
3.TCP与UDP的区别总结
- TCP面向连接;而UDP是无连接。
- TCP更加可靠,数据不会出现丢失,且会按序到达;UDP容易出现丢包的情况。
- TCP只能一对一通信;UDP可以实现一对一,一对多,多对一,和多对多的通信方式。
- 传输方式不同,TCP是面向字节流,UDP是面向报文。
- TCP首部较小最小20字节,最大60字节;UDP首部仅为8字节,开销更小。
- TCP适用于对时间没有太大限制,不允许出现差错的情况,比如发送短信,文件传输等等;UDP更具有实时性,所以适用于视频,电话,直播等等。