0%

tcp之tcp和udp协议的对比

七层模型

功能 协议
应用层 网络服务与最终用户的一个接口。 HTTP, FTP, SMTP, websocket
表示层 数据的表示、安全、压缩。(在五层模型里面已经合并到了应用层)
会话层 建立、管理、终止会话。(在五层模型里面已经合并到了应用层)
传输层 定义传输数据的协议端口号,以及流控和差错校验。 TCP, UDP
网络层 进行逻辑地址寻址,实现不同网络之间的路径选择。 ICMP, IP
数据链路层 建立逻辑连接、进行硬件地址寻址、差错校验等功能。
物理层 建立、维护、断开物理连接。

数据在网络上传输,通过网络层的IP地址找到目标主机,通过传输层的端口号定位目标主机上的服务(应用程序)。

TCP(TCP可靠性)

传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

可靠性:TCP为了保证报文传输的可靠,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的字节发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据(假设丢失了)将会被重传

TCP如何保证可靠的传输层:TCP在数据传输之前有三次握手来建立连接,并且在数据传递时,有确认、重传、流量控制、拥塞控制,在数据传输完之后,还会断开连接用来节约系统资源, 其中确认,重传,流量控制以及报文排序都是基于 syn 的设计来实现的

TCP 会保证每一个报文都能够抵达对方,它的机制是这样:报文发出去后,必须接收到对方返回的确认报文 ACK,如果迟迟未收到,就会超时重发该报文,直到收到对方的 ACK 为止。所以,TCP 报文发出去后,并不会立马从内存中删除,因为重传时还需要用到它。由于 TCP 是内核维护的,所以报文存放在内核缓冲区。如果连接非常多,我们可以通过 free 命令观察到 buff/cache 内存是会增大。

TCP可靠传输的实现

TCP 连接的每一端都必须设有两个窗口——一个发送窗口和一个接收窗口。TCP 的可靠传输机制用字节的序号进行控制。TCP 所有的确认都是基于序号而不是基于报文段。发送过的数据未收到确认之前必须保留,以便超时重传时使用。发送窗口没收到确认前不动,收到新的确认前移

发送缓存用来暂时存放: 发送应用程序传送给发送方 TCP 准备发送的数据;TCP 已发送出但尚未收到确认的数据。

接收缓存用来暂时存放:按序到达的、但尚未被接收应用程序读取的数据; 不按序到达的数据。
必须强调三点:

  • A 的发送窗口并不总是和 B 的接收窗口一样大(因为有一定的时间滞后)。
  • TCP 标准没有规定对不按序到达的数据应如何处理。通常是先临时存放在接收窗口中,等到字节流中所缺少的字节收到后,再按序交付上层的应用进程。
  • TCP 要求接收方必须有累积确认的功能,这样可以减小传输开销

UDP

用户数据报协议(UDP,User Datagram Protocol)为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据报的方法。

在选择UDP作为传输协议时必须要谨慎。在网络质量令人十分不满意的环境下,UDP协议数据包丢失会比较严重。但是由于UDP的特性:它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。

TCP 和 UDP 对比

功能 TCP UDP
连接 面向连接 无连接
传输双方 一对一,所以必须要提前建立连接,只支持单播 一对一、一对多、一对全都可以,即支持单播、广播、全播。
传输可靠性 可靠 不可靠
传输形式 字节流,仅把应用进程交下来的报文当作一连串的字节流,然后对这些字节流进行分组、编号、发送 数据报文段(UDP对应用进程交下来的报文既不合并、也不会拆分,而是保留这些报文的边界)
应用场景 要求通信数据可靠(比如文件传输、邮件传输) 要求实时性强,且对丢数据有一定容忍性
提供服务 可以向上层提供面向连接可靠服务,不会出现误码、丢失。 接收方不需要发送ack,发送方也不关系ack
性能 传输效率:慢
所需资源:多
传输效率:快
所需资源:少
  • TCP提供面向连接的服务,在传送数据之前必须先建立连接,数据传输结束之后要释放连接,TCP不提供多播和广播。并且由于TCP提供可靠的、面向连接的运输服务,这些难免会增加系统的开销,如确认,流量控制,计时器以及连接管理,使得首部字节增大很多,还需要占用很多的处理机资源。TCP一般用于文件传输、发送和接受邮件、远程登陆等场景。
  • UDP传输数据之前不需要先建立连接,远地主机在收到UDP报文后,不需要给出任何确认,远地主机假如发现UDP报文段出错,直接丢弃,也不需要给发送主机返回消息

参考

百度百科

计算机网络-TCP和UDP的区别: https://segmentfault.com/a/1190000021688094