标签:
概述
TCP协议和UDP协议处于同一层:传输层,但是两者之间有很大的区别,TCP协议具有以下特点:
TCP报文结构:
TCP 报文段的报头有前 20 字节的固定部分,后面 4n 字节是根据需要而添加的字段,下图是TCP完整的报文结构:
20 字节的固定部分,各字段功能说明:
TCP连接和释放:
3.1. 三次握手
TCP三次握手过程:
3.2. 四次挥手
TCP四次挥手过程:
注意此时连接还没有释放,需要时间等待状态结束后(4 分钟) 连接两端才会 CLOSED。设置时间等待是因为,有可能最后一个确认报文丢失而需要重传,下面具体阐述TIME-WAIT(时间等待)状态的原因:
TIME_WAIT状态维持的时间是最长分节生命期的2倍,2MSL(MSL=30s~120s)
3.3. TIME-WAIT状态的带来的影响和解决方法
由于TIME-WAIT状态的存在,使得socket可以进入和留存相当长一段时间,如果你的系统中有很多 socket 处于TIME-WAIT状态,那么当你需要创建新的 socket 连接的时候可能会受到影响,这也会影响到你的程序的扩展性。因为在一个TCP连接中,一个Socket如果关闭的话,它将保持TIME-WAIT状态大约 4分钟 。如果很多连接快速的打开和关闭的话,系统中处于TIME-WAIT状态的socket将会积累很多,你可以使用netstat命令查看处于TIME-WAIT状态的socket。由于本地端口数量的限制,同一时间只有有限数量的socket连接可以建立,如果太多的socket处于TIME_WAIT状态,你会发现,由于用于新建连接的本地端口太缺乏,将会很难再建立新的对外连接。在Linux中,可以通过设置SO_REUSEADDR允许连接重用,TIME-WAIT的存在是有它的理由的,通过缩短2MSL的时间或者使用SO-REUSEADDR允许连接重用并不总是好主意。如果你有能力去设计你的协议避免TIME-WAIT产生的问题的话,你就可以避免这里所有的问题。
TCP可靠传输的实现:
超时重传机制很费时间,每发送一个数据报都要等待确认。在实际应用中的确不是这样的,真实情况是,采用了流水线传输:发送方可以连续发送多个报文段(连续发送的数据长度叫做窗口),而不必每发完一段就停下来等待确认。实际应用中,接收方也不必对收到的每个报文都做回复,而是采用累积确认方式:接收者收到多个连续的报文段后,只回复确认最后一个报文段,表示在这之前的数据都已收到。这样,传输效率得到了很大的提升。
用户数据报协议,它只在 IP 数据报服务之上增加了很少一点功能,它的主要特点有:
(1) UDP 是无连接的,发送数据之前不需要建立连接(而 TCP 需要),减少了开销和时延。
(2) UDP尽最大努力交付,不保证交付可靠性。
(3) UDP 是面向报文的,对于从网络层交付下来的 IP 数据报,只做很简单的封装(8 字节 UDP 报头),首部开销小。
(4) UDP 没有拥塞控制,出现网络拥塞时发送方也不会降低发送速率。这种特性对某些实时应用是很重要的,比如 IP 电话,视频会议等,它们允许拥塞时丢失一些数据,因为如果不抛弃这些数据,极可能造成时延的累积。
(5) UDP 支持一对一、一对多、多对一和多对多的交互通信。
UDP报文:
UDP 数据报可分为两部分:UDP 报头和数据部分。其中数据部分是应用层交付下来的数据。UDP 报头总共 8 字节,而这 8 字节又分为 4 个字段:
(1)源端口 2 字节 在对方需要回信时可用,不需要时可以全 0;
(2)目的端口 2 字节 必须,也是最重要的字段;
(3)长度 2 字节 长度值包括报头和数据部分;
(4)校验和 2 字节 用于检验 UDP 数据报在传输过程中是否有出错,有错就丢弃。
面向报文的传输方式是应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。因此,应用程序必须选择合适大小的报文。若报文太长,则IP层需要分片,降低效率。若太短,会是IP太小。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。这也就是说,应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。
面向字节流的话,虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序看成是一连串的无结构的字节流。TCP有一个缓冲,当应用程序传送的数据块太长,TCP就可以把它划分短一些再传送。如果应用程序一次只发送一个字节,TCP也可以等待积累有足够多的字节后再构成报文段发送出去。
TCP和UDP的对比:
标签:
原文地址:http://blog.csdn.net/sweetgum2012/article/details/51176948