计算机网络基础
TCP与UDP
都同属于TCP/IP协议簇。
UDP | TCP | |
---|---|---|
是否连接 | 无连接 | 面向连接 |
是否可靠 | 不可靠传输,不使用流量控制和拥塞控制 | 可靠传输(数据顺序和正确性),使用流量控制和拥塞控制 |
连接对象个数 | 支持一对一,一对多,多对一和多对多交互通信 | 只能是一对一通信 |
传输方式 | 面向报文 | 面向字节流 |
首部开销 | 首部开销小,仅8字节 | 首部最小20字节,最大60字节 |
适用场景 | 适用于实时应用,例如视频会议、直播 | 适用于要求可靠传输的应用,例如文件传输 |
TCP
TCP(Transmission Control Protocol,传输控制协议)是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。
TCP三次握手
- A->B,发送一个含有同步序列号标志位数据,请求建立连接–希望通信、你可以用哪个序列号作为起始数据段回应
- B->A,ACK+SYN响应–收到请求,你可以用哪个序列号作为起始数据段回应
- A->B,ACK–确认已收到主机B 的数据段
特点:没有应用层的数据 ,SYN这个标志位只有在TCP建立连接时才会被置1 ,握手完成后SYN标志位被置0。
TCP四次挥手
- A提出停止TCP连接的请求,将控制位FIN置一
- B收到FIN确认这一方向上的TCP连接将关闭,将ACK置1,
- B提出反方向的关闭请求,将FIN置1
- A请求进行确认,将ACK置1,双方向的关闭结束.
连接机制原因
为什么握手要三次,挥手却要四次呢?
那是因为握手的时候并没有数据传输,所以服务端的 SYN 和 ACK 报文可以一起发送,但是挥手的时候有数据在传输,所以 ACK 和 FIN 报文不能同时发送,需要分两步,所以会比握手多一步。
为什么要三次握手
三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。
只有经过三次握手才能确认双发的收发功能都正常,缺一不可:
第一次握手(客户端发送 SYN 报文给服务器,服务器接收该报文):客户端什么都不能确认;服务器确认了对方发送正常,自己接收正常
第二次握手(服务器响应 SYN 报文给客户端,客户端接收该报文):客户端确认了:自己发送、接收正常,对方发送、接收正常;服务器确认了:对方发送正常,自己接收正常
第三次握手(客户端发送 ACK 报文给服务器):客户端确认了:自己发送、接收正常,对方发送、接收正常; 服务器确认了:自己发送、接收正常,对方发送、接收正常
为什么要四次挥手
由于 TCP 的半关闭(half-close)特性,TCP 提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。
任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了TCP连接。
实现数据可靠传输,为什么刚好需要三次握手呢?如果两次握手,行不行?
两次握手:
- A发送同步信号SYN+A的初始序列号
- B发送同步信号SYN+B的初始序列号+B的ACK序列号
两次握手会产生一个问题,B没办法知道A是不是已经接收了自己的同步信号。一旦这个同步信号丢了,A和B就B的初始序列号将无法达成一致。
显然,两次握手是不可取的。
那么四次握手又如何呢?
- A发送同步信号SYN+A的初始序列号
- B确认收到A的同步信号,并记录A的ISN到本地,命名B的ACK序列号
- B发送同步信号SYN+B的初始序列号
- A确认收到B的同步信号,并记录B的ISN到本地,命名A的ACK序列号
显然,并不需要四个步骤,2和3和可以合并,提高连接的速度和效率。
TCP协议需考虑到可靠性和传输效率,明白了这一点,我们也就明白了为什么只能是三次握手,而不是两次或者四次了。
UDP
UDP 在传送数据之前不需要先建立连接,远程主机在收到 UDP 报文后,不需要给出任何确认。
Refs
- TCP和UDP的区别 (zhihu.com)
- [TCP 和 UDP 是什麼:簡單的說明 | NordVPN](https://nordvpn.com/zh-tw/blog/tcp-udp-bijiao/#:~:text=TCP 有錯誤檢查和,服務,例如FTP 檔案傳輸。)
- 关于TCP为什么三次握手和四次挥手,满分回答在此 - 知乎 (zhihu.com)
- TCP为什么是三次握手?两次、四次握手不行吗?-tcp三次握手 (51cto.com)