三、TCP协议与UDP协议
1、TCP/IP、TCP、 UDP是什么
TCP/IP协议是一个协议簇,里面包括很多协议的, UDP只是其中的一个, 之所以命名为TCP/IP协议, 因为TCP、 IP协议是两个很重要的协议,就用他两命名了,而TCP和UDP是位于TCP/IP模型中传输层的两 个协议,他们代表着TCP/IP模型所具备的两种通信模式。
TCP (Transmission Control Protocol)传输控制协议,也叫数据流协议 。 UDP (User Datagram Protocol)用户数据报文协议,也叫报文协议。
TCP是一种面向广域网的通信协议,目的是在跨越多个网络通信时,为两个通信端点之间提供一条安 全可靠的通信方式:
TCP的主要特点:
基于流的方式
面向连接;
可靠通信方式;
在网络状况不佳的时候尽量降低系统由于重传带来的带宽开销;
通信连接维护是面向通信的两个端点的,而不考虑中间网段和节点。
数据分片: 在发送端对用户数据进行分片,在接收端进行重组,由TCP确定分片的大小并控制分片和 重组;
到达确认: 接收端接收到分片数据时,根据分片数据序号向发送端发送一个确认;
超时重发: 发送方在发送分片时启动超时定时器,如果在定时器超时之后没有收到相应的确认,重发 分片;
滑动窗口: TCP连接每一方的接收缓冲空间大小都固定,接收端只允许另一端发送接收端缓冲区所能 接纳的数据, TCP在滑动窗口的基础上提供流量控制,防止较快主机致使较慢主机的缓冲区溢出;
失序处理: 作为IP数据报来传输的TCP分片到达时可能会失序, TCP将对收到的数据进行重新排序,将 收到的数据以正确的顺序交给应用层;
重复处理: 作为IP数据报来传输的TCP分片会发生重复, TCP的接收端必须丢弃重复的数据;
数据校验: TCP将保持它首部和数据的检验和,这是一个端到端的检验和,目的是检测数据在传输过 程中的任何变化。如果收到分片的检验和有差错, TCP将丢弃这个分片,并不确认收到此报文段导致对 端超时并重发。
TCP是因特网中的传输层协议,使用三次握手协议建立连接。当主动方发出SYN连接请求后,等待对 方回答SYN+ACK,并最终对对方的 SYN 执行 ACK 确认。这种建立连接的方法可以防止产生错误的连 接,TCP使用的流量控制协议是可变大小的滑动窗口协议。
建立一个连接需要三次握手,而终止一个连接要经过四次握手,这是由TCP的半关闭(half-close)造 成的。
1. 客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。
2. 服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态。
3. 客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。 三次握手完成, TCP客户端和服务器端成功地建立连接,可以开始传输数据了。
TCP四次挥手的过程:
1. 某个应用进程首先调用close,称该端执行“主动关闭”(active close)。该端的TCP于是发送一个FIN分节,表示数据发送完毕。
2. 接收到这个FIN的对端执行 “被动关闭”(passive close),这个FIN由TCP确认。
注意: FIN的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程,放在已排队等候 该应用进程接收的任何其他数据之后,因为, FIN的接收意味着接收端应用进程在相应连接上再无 额外数据可接收。
3. 一段时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字。这导致它的TCP也发 送一个FIN。
4. 接收这个最终FIN的原发送端TCP (即执行主动关闭的那一端)确认这个FIN。 [3]
既然每个方向都需要一个FIN和一个ACK,因此通常需要4个分节,所以叫四次挥手。
注意:
1. “通常”是指,某些情况下,步骤1的FIN随数据一起发送,另外,步骤2和步骤3发送的分节都出自执 行被动关闭那一端,有可能被合并成一个分节。
2. 在步骤2与步骤3之间,从执行被动关闭一端到执行主动关闭一端流动数据是可能的,这称为“半关
闭”(half-close)。
3. 当一个Unix进程无论自愿地(调用exit或从main函数返回)还是非自愿地(收到一个终止本进程的 信号)终止时,所有打开的描述符都被关闭,这也导致仍然打开的任何TCP连接上也发出一个
FIN。
4. 无论是客户还是服务器,任何一端都可以执行主动关闭。通常情况是,客户执行主动关闭,但是某 些协议,例如, HTTP/1.0却由服务器执行主动关闭。
是一种支持无连接的传输协议, UDP协议与TCP协议一样用于处理数据包,在OSI模型中,两者都位于 传输层,处于IP协议的上一层,与TCP互为补充, UDP为应用程序提供了一种无需建立连接就可以发送 封装的 IP 数据包的方法。
由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时 向多个客户机传输相同的消息(多对多通信)。
UDP的主要特点:
UDP它除了给应用程序发送数据包功能并允许它们在所需的层次上架构自己的协议之外,几乎没有做 什么特别的事情,而TCP协议几乎做了所有通信协议该做的事情。
UDP不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法 得知其是否安全完整到达的。
UDP的首部格式:
UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包而言UDP的额外开销很小。
数据报的长度是指包括报头和数据部分在内的总字节数。因为报头的长度是固定的,所以该域主要被 用来计算可变长度的数据部分(又称为数据负载)。
数据报的最大长度根据操作环境的不同而各异。从理论上说,包含报头在内的数据报的最大长度为 65535字节。不过, 一些实际应用往往会限制数据报的大小,有时会降低到8192字节。
吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的
限制。
UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层,既不 拆分,也不合并,而是保留这些报文的边界,由应用程序需要选择合适的报文大小。
Checksum:
UDP协议使用报头中的校验值来保证数据的安全。校验值首先在数据发送方通过特殊的算法计算得 出,在传递到接收方之后,还需要再重新计算。
如果某个数据报在传输过程中被第三方篡改或者由于线路噪音等原因受到损坏,发送和接收方的校验 计算值将不会相符,由此UDP协议可以检测是否出错。这与TCP协议是不同的,后者要求必须具有校验 值。
UDP的适用范围:
它主要用于不要求分组顺序到达的传输中,分组传输顺序的检查与排序由应用层完成 ,也就是可靠性 由应用层负责, UDP协议适用运行在同一台设备上的多个应用程序进行通信,即使进行网络通信也只适 合于一次传输少量数据,使用UDP协议包括: TFTP、SNMP、 NFS、 DNS、 BOOTP。
UDP报文没有可靠性保证、顺序保证和流量控制字段等,可靠性较差。但是正因为UDP协议的控制选 项较少,在数据传输过程中延迟小、数据传输效率高,适合对可靠性要求不高的应用程序,或者可以保 障可靠性的应用程序。
多媒体数据流,不产生任何额外的数据,即使知道有破坏的包也不进行重发。当强调传输性能而不是 传输的完整性时,如:音频和多媒体应用, UDP是最好的选择。在数据传输时间很短,以至于此前的连 接过程成为整个流量主体的情况下, UDP也是一个好的选择。
TCP向上层提供面向连接的可靠服务 , UDP向上层提供无连接不可靠服务。
虽然 UDP 并没有 TCP 传输来的准确,但是 也能在很多实时性要求高的地方有所作为。
UDP | TCP | |
是否连接 | 无连接 | 面向连接 |
是否可靠 | 不可靠传输,不使用流量控制和拥塞控制 | 可靠传输,使用流量控制和拥塞 控制 |
连接对象个 数 | 支持一对一 ,一对多,多对一和多对多交互 通信 | 只能是一对一通信 |
传输方式 | 面向报文 | 面向字节流 |
首部开销 | 首部开销小,仅8字节 | 首部最小20字节,最大60字节 |
适用场景 | 适用于实时应用(IP电话、视频会议、直播 等) | 适用于要求可靠传输的应用 |