最近在写WIFI模块,所以就想明确一些TCP和UDP的区别,发现以前的理解还是有点误区。现在重新学习。
相同点
UDP协议和TCP协议都是传输层协议
TCP(Transmission Control Protocol, 传输控制协议)提供的是面向连接,可靠的字节流服务。即客户和服务器交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。并且提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。
UDP(User Data Protocol,用户数据报协议)是一个简单的面向数据报的传输层协议。它不提供可靠性,只是把应用程序传给IP层的数据报发送出去,但是不能保证它们能到达目的地。由于UDP在传输数据报前不用再客户与服务器之间建立一个连接,且没有超时重发等机制,所以传输速度很快。
不同点
1、报头不同
2、特点不同
3、协议不同
UDP
UDP数据报最大长度64K(包含UDP首部),如果数据长度超过64K就需要在应用层手动分包,UDP无法保证包序,需要在应用层进行编号。
特点
1、无连接:知道对端的IP和端口号就直接进行运输,不需要建立连接。
2、不可靠:没有确认机制,没有重传机制;如果因为网络故障该段无法发到对方,UDP协议层也不会给应用层返回任何错误信息。
3、面向数据报:不能够灵活的控制读写数据的次数和数量,应用层交给UDP多长的报文,UDP鸳鸯发送,既不会拆分,也不会合并。
4、数据收不够灵活,但是能够明确区分两个数据包,避免粘包问题。
协议:
NFS:网络文件系统
TFTP:简单文件传输协议
DHCP:动态主机配置协议
BOOTP:启动协议(用于无盘设备启动)
DNS:域名解析协议
TCP
特点:面向连接
1、面向连接
TCP三次握手过程
1、主机A通过向主机B发送一个含有同步序列号标志位的数据段(SYN)给主机B,向主机B请求建立连接,通过这个数据段,主机A告诉主机B两件事:我想要和你通信;你可以用哪个序列号作为起始数据段来回应我。
2、主机B收到主机A的请求后,用一个带有确认应答(ACK)和同步序列号(SYN)标志位的数据段响应主机A,也告诉主机A两件事:我已经收到你的请求了,你可以传输数据了;你要用哪个序列号作为起始数据段来回应我。
3、主机A收到这个数据段后,再发送一个确认应答,确认已收到主机B的数据段:“我已收到回复,我现在要开始传输实际数据了”。
这样3次握手就完成了,主机A和主机B就可以传输数据了。
TCP四次挥手过程
1、当主机A完成数据传输后,将控制位FIN置1,提出停止TCP连接的请求。
2、主机B收到FIN后对其作出响应,确认这一方向上的TCP连接将关闭,将ACK置1。
3、主机A对主机B的请求确认,将ACK置1,双方向的关闭结束。
TIME_WAIT状态
TCP协议规定,主动关闭连接的一方要处于TIME_WAIT状态,等待两个MSL(最大报文生存周期)的时间后才能回到CLOSED状态。
TIME_WAIT持续存在2MSL的话,就能保证在两个传输方向上的尚未被接收或迟到的报文段都已经消失(否则服务器立刻重启,可能会收到来自上一个进程的迟到的数据,但是这种数据很可能是错误的)。同时也是在理论上保证最后一个报文可靠到达(假设最后一个ACK丢失,那么服务器会再重发一个FIN。这时虽然客户端的进程不在了,但是TCP连接还在,仍然可以重发LAST_ACK)。