1.概念
TCP(传输控制协议)是面向连接、可靠的字节流服务,客户端与服务端交换数据之前,必须建立连接才能传输数据。
UDP(用户数据报协议)是一个简单的面向数据报的传输层协议,不提供可靠性,只是把应用程序传递给IP层的数据报发送出去,但不能保证能否顺利地到达目的地。
2.TCP和UDP区别
- 连接方面
tcp面向连接,udp不需要连接;- 可靠性
tcp是可靠传输,一旦传输过程中丢包的话会进行重传;
udp是不可靠传输,但会最大努力交付。- 工作效率
UDP实时性高,比TCP工作效率高。- 是否支持多对多
TCP是点对点的;
UDP支持一对一,一对多,多对多。- 首部大小
TCP首部占20字节;
UDP首部占8字节。
3.TCP和UDP的应用场景
TCP应用场景:
对数据传输可靠性要求较高的场景(例:文本传输、重要状态更新、登录数据传输),时数据传输性能让位于数据传输的完整性,可控制性和可靠性。
UDP应用场景:
- 面向数据报方式,客户端数量较多;
- 对数据安全姓无特殊要求,对响应速度要求高。
4.TCP和UDP的报头
TCP报头
UDP报头
5.TCP的三次握手和四次挥手
TCP三次握手
1.TCP服务器进程先创建传输控制模块(TCB),进入监听(lsiten)状态,等待客户端的连接请求;
2.TCP客户端创建TCB,向服务器发出连接请求报文,进入同步已发送(SYN-SENT)状态;
请求报文:【同部位 SYN=1,初始序列号 seq=x】
3.TCP服务器收到请求报文后,如果同意连接则发出确认报文,进入同步收到(SYN-RCVD)状态;确认报文:【ACK=1,SYN=1,确认号ack=x+1,初始的序列号 seq=y】
4.TCP客户端收到确认后,返回TCP服务器确认,建立TCP连接,客户端进入已建立连接(ESTABLISHED)状态;确认报文【ACK=1,ack=y+1,自己序列号seq=x+1】
5.TCP服务器收到TCP客户端的确认后进入已建立连接(ESTABLISHED)状态,双方开始通信。
TCP四次挥手
1.客户端进程发出释放报文和数据报文首部,停止发送数据,进入终止等待1(FIN-WAIT-1)状态;释放报文【FIN=1,序列号seq=u】;
2.服务器收到连接的释放报文,发出确认报文,进入关闭(CLOSE-WAIT)状态;确认报文【ACK=1,ack=u+1,seq=v,】(这时处于半关闭状态,虽然客户端没有发送数据,但服务器如果要发送数据给客户端,客户端依然要接收);
3.客户端接收到服务器的确认请求后,进入FIN-WAIT-2(终止等待2)状态,等待服务器发送释放报文;
4.服务器将数据发送完后,向客户端发送连接释放报文,服务器进入LAST-ACK(最后确认)状态,等待客户端确认;释放报文【FIN=1,ack=u+1,seq=w】
5.客户端收到服务器的连接最后释放报文后,发出确认,进入TIME-WAIT(时间等待)状态;确认报文【ACK=1,ack=w+1,seq=u+1】(此时TCP连接还未释放,必须等待2MSL(最长报文段寿命)的时间后,等客户端撤销相应的TCB后才进入CLOSED状态);
6.服务器收到客户端发出的确认后,撤销TCB,立即进入CLOSED状态,结束TCP连接。
6.思考
当SYN=1报文段时,不能携带数据,且需要消耗一个序列号;在客户端进入已连接状态时,ACK报文段可以携带数据,不携带数据的话,就不用消耗序列号。
(1)为什么是三次握手(而不是二次)?
主要防止已经失效的连接请求报文又传回服务器,从而产生错误,两次握手机制会让客户端和服务器再次建立连接,导致不必要的错误和资源的浪费。
(2)TCP服务端先开始创建TCB,先结束TCP连接。
(3)为什么建立是三次握手,关闭连接是四次挥手在建立连接时,服务器在LISTEN状态下,收到客户端发来的SYN请求报文后,把ACK和SYN放在一个报文中返回给客户端;而在关闭连接时,服务端收到FIN报文时,仅代表客户端不再发送数据但还可以接收数据,而服务器也未将数据发送完毕,而服务器一般会将ACK和FIN分开发送,从而导致多了一次。