TCP
为什么会产生 TCP 协议?
背景
- 记得咱们之前介绍的TCP/IP五层协议栈把,在因特网协议族(Internet protocol suite)中,TCP 层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道 (Unix 的 Socket)一样的连接,但是 IP 层不提供这样的流机制,而是提供不可靠的包交换,因此 TCP 协议应运而生
概述
- 传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由 IETF的 RFC 793 定义
- TCP旨在适应支持多网络应用的分层协议层次结构。 连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。TCP假设它可以从较低级别的协议获得简单的,可能不可靠的数据报服务。 原则上,TCP应该能够在从硬线连接到分组交换或电路交换网络的各种通信系统之上操作
- TCP 简单的来说,就是给应用数据传输提供可靠的传输,既要足够快地发送数据报,以便使用网络容量,但又不能引起网络拥塞
IETF( The Internet Engineering Task Force)组织是互联网工程任务组缩写,成立于1985年,他们主要的任务就是编写互联网的各种标准,而RFC文档,就是他们的产物
TCP 协议提供可靠传输基本逻辑
- 应用层向 TCP 层发送用于网间传输的、用8位字节表示的数据流
- TCP 将数据流分割成适当长度的报文段(通常受该计算机连接的网络的数据链路层的 MTU的限制)
- TCP 把结果包传给 IP 层,由它来透过网络将包传送给接收端实体的 TCP 层。TCP 为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收
- 接收端实体对已成功收到的包发回一个相应的确认信息(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失并进行重传。
- TCP 用一个校验和函数来检验数据是否有错误,在发送和接收时都要计算校验和
TCP报文格式
报文字段详解
TCP三次握手
TCP四次挥手
UDP
定义
- UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768 [1] 是UDP的正式规范。UDP在IP报文的协议号是17。
- 非面向连接的不可靠的传输协议
- 传输效率高
UDP报头
在UDP协议层次模型中,UDP位于IP层之上。应用程序访问UDP层然后使用IP层传送数据包。IP数据包的数据部分即为UDP数据包。IP层的报头指明了源主机和目的主机地址,而UDP层的报头指明了主机上的源端口和目的端口。UDP传输的段(segment)有8个字节的报头和有效载荷字段构成。
UDP报头由4个域组成,其中每个域各占用2个字节,具体包括源端口号、目标端口号、数据包长度、校验值。
以下将对UDP数据报格式进行简要介绍,具体内容请参照RFC 768 。
端口号:
UDP协议使用端口号为不同的应用保留其各自的数据传输通道。UDP和TCP协议正是采用这一机制实现对同一时刻内多项应用同时发送和接收数据的支持。数据发送一方(可以是客户端或服务器端)将UDP数据包通过源端口发送出去,而数据接收一方则通过目标端口接收数据。有的网络应用只能使用预先为其预留或注册的静态端口;而另外一些网络应用则可以使用未被注册的动态端口。因为UDP报头使用两个字节存放端口号,所以端口号的有效范围是从0到65535。一般来说,大于49151的端口号都代表动态端口。UDP端口号指定有两种方式:由管理机构指定端口和动态绑定的方式。
长度:
数据报的长度是指包括报头和数据部分在内的总字节数。因为报头的长度是固定的,所以该域主要被用来计算可变长度的数据部分(又称为数据负载)。数据报的最大长度根据操作环境的不同而各异。从理论上说,包含报头在内的数据报的最大长度为65535字节。不过,一些实际应用往往会限制数据报的大小,有时会降低到8192字节。
校验值:
UDP协议使用报头中的校验值来保证数据的安全。校验值首先在数据发送方通过特殊的算法计算得出,在传递到接收方之后,还需要再重新计算。如果某个数据报在传输过程中被第三方篡改或者由于线路噪音等原因受到损坏,发送和接收方的校验计算值将不会相符,由此UDP协议可以检测是否出错。这与TCP协议是不同的,后者要求必须具有校验值。 [5]
许多链路层协议都提供错误检查,包括流行的以太网协议,也许你想知道为什么UDP也要提供检查和校验。其原因是链路层以下的协议在源端和终端之间的某些通道可能不提供错误检测。虽然UDP提供有错误检测,但检测到错误时,UDP不做错误校正,只是简单地把损坏的消息段扔掉,或者给应用程序提供警告信息。
结语
- 咱们先简单了解一下TCP的概念,其实就是防止数据丢失的传输协议,后面会有更深入的分析。
- UDP这个协议的话,其实秉持着尽力而为的模型,是不关心网络质量的,只是为了快速传输诞生的,所以没TCP的众多传输机制,还算比较简单。