简介
本文介绍TCP与UDP的相关知识。
简述TCP三次握手和四次挥手
其他网址
《计算机网络》=> 5.9 TCP的运输连接管理
三次握手
主机 A为客户端,主机B为服务端。
- 第一次握手
- A 发送同步报文段(SYN) 请求建立连接。
- A进入SYN-SENT(同步已发送)状态。
- 第二次握手
- B 监听到连接请求, 向 A 发送针对 SYN 的确认 ACK, 同时 B 也发送自己的请求建立连接(SYN) 。
- B进入SYN-RCVD (同步收到)状态
- 第三次握手
- A 收到 B 发出的 SYN,给出确认应答 ACK。
- A 收到确认后进入 ESTABLISHED (己建立连接)状态。B 收 到 A 的确认后,也进入ESTABLISHED状态
四次挥手
- 第一次挥手
- 当主机 A 发送数据完毕后, 发送 FIN 结束报文段。
- 第二次挥手
- 主机 B 收到 FIN 报文段后, 向主机 A 发送一个确认序号 ACK(为防止这段时间内, 对方重传 FIN 报文段) 。
- 第三次挥手
- 主机 B 准备关闭连接, 向主机 A 发送一个 FIN 结束报文段。
- 第四次挥手
- 主机 A 收到 FIN 结束报文段后, 进入 TIME_WAIT 状态。 并向主机 B 发送一个ACK 表示连接彻底释放。
TCP与UDP的区别
项 | TCP | UDP |
是否连接 | 面向连接(如打电话要先拨号建立连接) | 无连接的, 即发送数据之前不需要建立连接 |
可靠性 | 可靠。(无差错,不丢失,不重复,按序到达) (通过校验和、重传、序号标识、滑动窗口、 确认应答等实现可靠传输) | 尽力交付(不保证可靠交付) |
速度(效率) | 慢 (头部20字节) | 快 (头部8字节) |
节点数目 | 只能一对一 | 支持:一对一、一对多、多对一、多对多 |
传输模式 | 面向字节流。 (实际上是TCP把数据看成一连串无结构的字节流) | 面向报文。 (UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)) |
占用资源 | 占资源多 | 占资源少 |
应用场景 | 传输大量数据 | 传输少量数据 |
TCP握手/挥手 次数
TCP为什么要三次握手而不是两次
如果是 2 次(即:没有第3次握手)
- 网络延迟导致服务端建立连接,而客户端没建立连接
- 客户端发出一个请求报文段,它滞留在了某个网络节点, 过了好长时间才发送到服务端, 此时服务端建立连接。 但是由于现在客户端并没有发出连接请求, 因此不会理睬服务端的确认, 而服务端以为新的连接产生, 服务端的资源被浪费。
- 服务端的ACK丢失导致客户端一直重试,服务端会连接大量无效连接
- 当服务端的确认应答 ACK 总是丢失时, 客户端以为服务端没有连接, 它将会不断地重新请求连接,而服务端会连接大量的无效连接, 给服务器增加维护成本, 服务器很容易受到 SYN 洪水攻击。
TCP为什么是四次挥手
- TCP 是面向连接的, 属于全双工, 断开连接是双方的事情。 所以是四次。
- 当客户端发送 FIN 结束报文段时,服务端并不会立即关闭 SOCKET(服务端会先通知应用进程,应用进程再关闭),所以只能先发送一个 ACK。(因为有可能此时服务端还没有发送完报文)