Reference
TCP UDP
- TCP(Transmission Control Protocol):传输控制协议
- UDP(User Datagram Protocol):用户数据报协议
- TCP UDP 都是传输层协议
目录
TCP / UDP的区别
- TCP 是面向连接的协议,UDP 是无连接协议
- TCP 是字节流模式,UDP 是数据报模式
- TCP无界,UDP有界
- TCP有序,UDP无序
- TCP可靠,UDP不可靠
- TCP有流量控制(拥塞控制),UDP没有
- UDP程序结构较简单
TCP是面向连接的协议,UDP是无连接协议
TCP是面向连接的,在连接持续的过程中,socket中收到的数据都是由同一台主机发出的,因此,知道保证数据是有序的到达就行了,至于每次读取多少数据自己看着办。
UDP是无连接的协议,只要知道接收端的IP和端口,且网络是可达的,任何主机都可以向接收端发送数据。客户端一次读取超过一个报文的数据,则会数据错乱
TCP可靠,UDP不可靠
由于TCP有重传机制,UDP不会进行重传。
TCP有序,UDP无序
消息在传输过程中可能会乱序,后发送的消息可能会先到达,TCP会对其进行重排序,UDP不会。
UDP程序结构较简单
TCP报头是20字节 > UDP报头是8字节。
TCP和UDP的使用场景
-
UDP适用于对传输效率要求高,但准确率要求低的应用场景:
- 包总量较少的通信(DNS、SNMP等)
- 视频、音频等多媒体通信(即时通信)
- 广播通信
- DNS:用于域名解析服务,53号端口。
- SNMP:简单网络管理协议,使用161号端口,是用来管理网络设备的。由于网络设备很多,无连接的服务就体现出其优势。
- TFTP(Trival File Transfer Protocal),简单文件传输协议,该协议在熟知端口69上使用UDP服务。
-
TCP适合对传输效率要求低,但准确率要求高的应用场景:
- HTTP:万维网协议,是从Web服务器传输超文本到本地浏览器的传送协议。
- FTP:文件传输协议,使用21端口。
- Telnet:一种用于远程登陆的端口,使用23端口
- SMTP:邮件传送协议,用于发送邮件,使用25号端口。
- POP3:接收邮件,使用110端口。
为什么TCP会粘包、拆包,而UDP不会
TCP粘包、拆包发生原因
-
要发送的数据 > 发送缓冲区剩余空间大小,将会拆包。
-
待发送数据 > 最大报文长度,将会拆包。
-
要发送的数据 < TCP发送缓冲区的大小,TCP会启用Nagle算法,对多次的数据流进行合并,写入缓冲区的数据一次发送出去,将会发生粘包。
-
接收数据端的应用层没有及时读取缓冲区中的数据,服务器下次发送将会发生粘包。
再说UDP不会粘包、拆包原因
他不会对数据包进行合并发送,每一个数据包都是完整的(数据+UDP头+IP头等等封装一次)也就没有粘包一说了。
TCP粘包与分包的处理方法
客户端在数据包固定位置添加包的长度信息,服务器接收到数据后,先解析包长度,然后根据包长度截取数据包(客户端有自动重发机制,故而在应用层不会导致数据的不完整性)
TCP的三次握手
• 第一次握手:客户端发送一个同步标志SYN=1,ACK=0标志的数据包给接收端,请求进行连接;
• 第二次握手:接收端收到请求并且允许连接的话,就会发送一个SYN=1,ACK=1标志的数据包给发送端,可以通讯了,并且让发送端发送一个确认数据包
• 第三次握手:发送端发送一个SYN=0,ACK=1的数据包给接收端,确认连接建立,可以通讯。
• 中断连接端可以是Client端,也可以是Server端。
为什么连接的时候是三次握手,关闭的时候却是四次挥手?
• 因为三次握手中Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。
• 但是关闭连接时,当Server端收到FIN报文时,并不会立即关闭SOCKET,先应答Client端一个ACK报文,等确认所有的数据都发送完了,才能发送FIN报文,由于不能一起发送,所以是四次握手。