TCP和UDP相关问题

[TOC]

区别

TCP提供可靠的、面向连接的运输服务。在传输数据之前必须三次握手建立连接,数据传输结束之后,4次挥手释放连接,而且在数据传递时,又有确认应答、超时重传、流量控制、拥塞控制等机制保证传送数据的可靠性。TCP经常用于对网络通信质量有很高要求的地方,如文件传输,邮件发送,远程登录等场景。SMTP、TELNET、HTTP、FTP

UDP在传送数据之前不需要建立连接,目的主机收到UDP报文后,不需要给出确认。UDP不提供可靠交付,一般用于即时通信,如语音、视频、直播等。RIP(路由选择协议),DNS

什么是TCP的三次握手?

img

假设 A 为客户端,B 为服务器端。

最初客户端和服务端都处于 CLOSED(关闭) 状态。ACK为确认值,ack为确认编号

一开始,服务器首先创建传输控制块TCB,然后处于 LISTEN(监听) 状态,等待客户端的连接请求。

· 第一次握手:A 的 TCP 客户端进程创建传输控制块 TCB、向 B 发出连接请求报文段,这时首部中的同步位 SYN=1,同时选择一个初始序号 seq = x。这时,TCP 客户进程进入 SYN-SENT(同步已发送)状态。

· 第二次握手:B 收到连接请求报文后,向 A 发送确认。在确认报文段中应把 SYN 位和 ACK 位都置 1,己选择一个初始序号 seq = y,确认号 ack = x + 1。(请注意,这个报文段也不能携带数据,但同样要消耗掉一个序号。)这时 TCP 服务端进程进入 SYN-RCVD(同步收到)状态。

· 第三次握手:TCP 客户进程收到 B 的确认后,还要向 B 给出确认。确认报文段的 ACK 置 1,确认号 ack = y + 1,而自己的序号 seq = x + 1。(这时 ACK 报文段可以携带数据。但如果不携带数据则不消耗序号,这种情况下,下一个数据报文段的序号仍是 seq = x + 1。)这时,TCP 连接已经建立,A 进入 ESTABLISHED(已建立连接)状态。

为什么是三次握手?

三次握手的原因主要有两个目的,信息对等和防止超时。

从信息对等的角度看,双方只有确定 4 类信息才能建立连接,即 A 和 B 分别确认自己和对方的发送和接收能力正常。在第二次握手后,从 B 的角度看还不能确定自己的发送能力和对方的接收能力,只有在第三次握手后才能确认。

防止超时。三次握手也是防止失效连接突然到达导致脏连接,网络报文的生存时间往往会超过 TCP 请求超时时间,A 的某个超时连接请求可能会在双方释放连接之后到达 B,B 会误以为是 A 创建了新的连接请求,然后发送确认报文创建连接。如果是两次握手,连接已经建立了,服务器资源被白白浪费。如果是三次握手,B 由于长时间没有收到确认信息,最终超时导致创建连接失败,因此不会出现脏连接。

四次挥手?

img

由于TCP连接是全双工的,因此每个方向都必须单独关闭。当一方数据发送任务完成之后,可以发送FIN来终止这个方向的连接。而另一方可以继续发送数据。

· 客户端发送请求释放连接报文,FIN=1,seq=u;客户端进入FIN-WAIT-1状态;

· 服务器收到请求,发送确认报文。ACK=1,seq=v,ack=u+1;服务器进入CLOSE-WAIT状态。客户端收到后进入终止等待2FIN-WAIT-2;

· 服务器发送完数据之后,向客户端发送请求释放连接报文,FIN=1,ACK=1,seq=w,ack=u+1;进入LAST-ACK状态

·客户端收到请求后,发送确认报文,ACK=1,seq=u+1,ack=w+1。客户端进入TIME-WAIT状态,等待2MSL后进如CLOSED状态,服务器收到确认后进如CLOSED状态。

四次挥手的原因

第一点原因是为了保证被动关闭方可以进入 CLOSED 状态。MSL 是最大报文段寿命,等待 2MSL 可以保证 A 发送的最后一个确认报文能被 B 接收,如果该报文丢失,B 没有收到就会超时重传之前的 FIN+ACK 报文,而如果 A 在发送确认报文后就立即释放连接就无法收到 B 超时重传的报文,因而也不会再一次发送确认报文段,B 就无法正常进入 CLOSED 状态。

第二点原因是 2MSL 时间之后,本连接中的所有报文就都会从网络中消失,可以防止已失效连接的请求数据包与正常连接的请求数据包混淆而发生异常。

除此之外,TCP 还设有一个保活计时器,用于解决客户端主机故障的问题,服务器每收到一次客户的数据就重新设置保活计时器,时间为 2 小时。如果 2 小时内没有收到就间隔 75 秒发送一次探测报文,连续 10 次都没有响应后就关闭连接。

TCP是怎么保证可靠的?

TCP 的可靠传输包含很多机制,例如使用检验和来检测一个传输分组中的比特错误、使用定时器来用于超时重传一个分组、使用序号来检测丢失的分组和冗余副本、使用确认来告诉发送方确认的分组信息、使用否定确认来告诉发送方某个分组未被正确接收。除此之外,TCP 还使用流量控制拥塞控制来保证可靠性。