TCP和UDP分别用于什么情况,tcp三次握手四次挥手?

2021-02-25 09:37发布

TCP和UDP分别用于什么情况,tcp三次握手四次挥手?

TCP和UDP分别用于什么情况,tcp三次握手四次挥手?

10条回答
慕容
2021-02-25 11:22

首先是对两个概念的简要说明:
TCP(Transmission Control Protocol):传输控制协议;
UDP(User Datagram Protocol):用户数据报协议。

TCP 与 UDP 相同点

TCP 和 UDP 都是在网络层,都是传输层协议,都能保护网络层的传输,双方的通信都需要开放端口。

TCP 与 UDP 不同点

  1. TCP 是面向连接的协议,UDP 是无连接协议;
    TCP 使用三次握手连接,而 UDP 发送数据前不需要建立连接。

  2. 可靠性;
    TCP 更可靠,UDP 不可靠。TCP 丢包会自动重传,UDP 不会。

  3. 有序性;
    TCP 有序,UDP 无序。消息在传输过程中可能会乱序,后发送的消息可能会先到达,TCP 会对其进行重排序,UDP 不会。

  4. 有界性;
    TCP无界,UDP有界。TCP 通过字节流传输,UDP 中每一个包都是单独的。

  5. 流量控制;
    TCP有流量控制(拥塞控制),UDP没有。关于 TCP 的流量控制,笔者会在后续博文中陆续更新,此处不细说。

  6. 传输速度;
    TCP传输慢,UDP传输快。因为TCP需要建立连接、保证可靠性和有序性,所以比较耗时。这就是为什么视频流、广播电视、在线多媒体游戏等选择使用UDP。

  7. 协议包头大小;
    TCP 要建立连接、保证可靠性和有序性,就会传输更多的信息,如 TCP 的包头比较大。

  8. 资源耗费;
    TCP 需要更多的资源。

  9. 应用场景。
    TCP 一般应用在对可靠性要求比较高的场合,例如 http,ftp 等等。而 UDP 一般应用在对实时性要求较高场合,例如视频直播,大文件传输等等。

对上述异同点进行总结,则为:
1> TCP 是面向连接的、可靠的、有序的、速度慢的协议;UDP 是无连接的、不可靠的、无序的、速度快的协议;
2> TCP 开销比 UDP 大,TCP 头部需要20字节,UDP 头部只要8个字节;
3> TCP 无界有拥塞控制,UDP 有界无拥塞控制。

需要补充的是:
基于 TCP 的协议有:HTTP/HTTPS,Telnet,FTP,SMTP。
而基于 UDP 的协议有:DHCP,DNS,SNMP,TFTP,BOOTP。

针对上述所说的 TCP 相关知识,着重说一下一个比较经典的知识点:TCP 的三次握手与四次挥手

所谓三次握手即建立 TCP 连接,是指建立一个 TCP 连接时,需要客户端和服务器总共发送3个包以确认连接的建立。
这里写图片描述

首先弄清楚几个英文简写的意义:

SYN(synchronous 建立联机)
ACK(acknowledgement 确认)
FIN(finish 结束)
Seq (Sequence number 顺序号码)
Ack 序号(Acknowledge number 确认号码)
establish (建立,创建)

  1. 第一次握手:客户端将标志位 SYN 置为1,随机产生一个值 seq=J,并将该数据包发送给服务端,客户端进入 SYN_SENT 状态,等待服务端的确认;

  2. 第二次握手:服务端收到数据包后由标志位 SYN=1 知道 Client 请求建立连接,服务端将标志位 SYN 和 ACK 都置为1,ack (number )=J+1,随机产生一个值 seq=K,并将该数据包发送给 Client 以确认连接请求,Server 进入 SYN_RCVD 状态。

  3. 第三次握手:客户端收到确认后,检查 ack 是否为 J+1,ACK 是否为1,如果正确则将标志位 ACK 置为1,ack=K+1,并将该数据包发送给服务端,服务端检查 ack 是否为 K+1,ACK 是否为1,如果正确则连接建立成功,客户端和ç进入 ESTABLISHED 状态,完成三次握手,随后客户端与服务端之间可以开始传输数据了。

简明地说:首先客户端发送连接请求报文,服务端接受连接后回复 ACK 报文,并为这次连接分配资源。客户端接收到 ACK 报文后也向服务端发生 ACK 报文,并分配资源,这样 TCP 连接就建立了。

为什么要三次握手,而不是二次握手?

client 发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达 server。本来这是一个早已失效的报文段。但 server 收到此失效的连接请求报文段后,就误认为是 client 再次发出的一个新的连接请求。于是就向 client 发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要 server 发出确认,新的连接就建立了,这样会导致server资源的浪费。

这里写图片描述

  1. 第一次挥手:Client 发送一个 FIN,用来关闭 Client 到 Server 的数据传送,Client 进入 FIN_WAIT_1 状态。

  2. 第二次挥手:Server 收到 FIN 后,发送一个 ACK 给 Client,确认序号为收到序号+1(与 SYN 相同,一个 FIN 占用一个序号),Server 进入 CLOSE_WAIT 状态。

  3. 第三次挥手:Server 发送一个 FIN,用来关闭 Server 到 Client 的数据传送,Server 进入 LAST_ACK 状态。

  4. 第四次挥手:Client 收到 FIN 后,Client 进入 TIME_WAIT 状态,接着发送一个 ACK 给 Server,确认序号为收到序号+1,Server 进入 CLOSED 状态,完成四次挥手。

为什么 TCP 断开连接需要四次挥手?

确保数据能够完成传输。

关闭连接时,当收到对方的 FIN 报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭 SOCKET,也即你可能还需要发送一些数据给对方之后,再发送 FIN 报文给对方来表示你同意现在可以关闭连接了,所以它这里的 ACK 报文和 FIN 报文多数情况下都是分开发送的。

一周热门 更多>