TCP和UDP的详细区别
1. TCP是面向连接的,而UDP是无连接的。
连接的三次握手和断开连接的四次挥手 图如下:
UDP与TCP的区别:UDP是不面向连接的,TCP是面向连接的,那么为什么?
首先有个信道复用的概念: 1、频分复用 2、时分复用 3、波分复用 4、码分复用 5、空分复用 6、统计复用 7、极化波复用 。不同的信道复用技术,使用不同的复用技术,目的就是创建“虚拟信道”。
一个TCP协议连接其实就是在物理线路上创建的一条“虚拟信道”。这条“虚拟信道”建立后,在TCP协议发出FIN包之前(TCP断开连接时两个终端都会向对方发送一个FIN包),是不会释放的。正因为这一点,TCP协议被称为面向连接的协议!
UDP协议,一样会在物理线路上创建一条“虚拟信道”,否则UDP协议无法传输数据!但是,当UDP协议传完数据后,这条“虚拟信道”就被立即注销了!因此,称UDP是不面向连接的协议! (注意:一种物理线路,单位时间内,能够创建的“虚拟信道”是有限的).(这是我放在网络协议分层http://blog.csdn.net/zcyzsy/article/details/69378645中的一段话)
TCP是有虚电路服务的,而UDP没有。
2. TCP是可靠传输,而UDP是不可靠传输
可靠传输体现在(此段摘自: http://blog.csdn.net/hbhhww/article/details/8216541):
1、应用数据被分割成TCP认为最适合发送的数据块。这和UDP完全不同,应用程序产生的数据报长度将保持不变。 (将数据截断为合理的长度)
2、当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。(超时重发)
3、当TCP收到发自TCP连接另一端的数据,它将发送一个确认ack。这个确认不是立即发送,通常将推迟几分之一秒。 (对于收到的请求,给出确认ack响应)
(之所以推迟,可能是要对包做完整校验,主要是首部和数据检验和)
4、 TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)。 (校验出包有错,丢弃报文段,不给出响应,TCP发送数据端,超时时会重发数据)
5、既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。 (对失序数据进行重新排序,然后才交给应用层,TCP的数据包是有序的,重排序就是帧序列重组)
6、既然IP数据报会发生重复,TCP的接收端必须丢弃重复的数据。
(对于重复数据,能够丢弃重复数据)
7、TCP还能提供流量控制(滑动窗口机制)。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。 (TCP可以进行流量控制,防止较快主机致使较慢主机的缓冲区溢出)
流量控制(flow control)就是让发送方的发送速率不要太快,既要让接收方来得及接收,也不要使网络发生拥塞。利用滑动窗口机制可以很方便地在 TCP 连接上实现流量控制。
TCP 为每一个连接设有一个持续计时器。只要 TCP连接的一方收到对方的零窗口通知,就启动持续计时器,发送一个零窗口探测报文段。
简言之:TCP丢包会重组,还有定时确认和重传机制,而且会丢弃重复的包,TCP会进行校验,而UDP丢包则直接舍弃。
3. 包的结构不同,TCP复杂,UDP简单,他们的包头结构如下:
TCP的包头结构:
源端口 16位
目标端口 16位
序列号 32位
回应序号 32位
TCP头长度 4位
reserved 6位
控制代码 6位
窗口大小 16位
偏移量 16位
校验和 16位
选项 32位(可选)
这样我们得出了TCP包头(首部)的最小长度,为20字节。TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割。
UDP的包头结构:
源端口 16位
目的端口 16位
长度 16位
校验和 16位
这样UDP的首部为8个字节,总长度不超过65,535字节,正好放进一个IP数据包。
4. TCP是数据流模式(SOCK_STREAM),UDP是数据报模式(SOCK_DGRAM)
流模式:TCP把数据看成一连串无结构的字节流
数据报:UDP是面向报文的
5. 每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
6. UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
TCP 有拥塞控制,所以发送效率会比UDP低一点
网络中的链路容量和交换结点中的缓存和处理机都有着工作的极限,当网络的需求超过它们的工作极限时,就出现了拥塞。拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。
拥塞控制方法:
1.慢开始:在主机刚刚开始发送报文段时可先将拥塞窗口 cwnd 设置为一个最大报文段 MSS的数值。在每收到一个对新的报文段的确认后,将拥塞窗口增加至多一个 MSS的数值。用这样的方法逐步增大发送端的拥塞窗口 cwnd,可以使分组注入到网络的速率更加合理。每经过一个传输轮回,拥塞窗口(发送端)就加倍。
2.拥塞避免:让拥塞窗口缓慢增大,每经过一个往返时间就加1,而不是加倍,按线性规律缓慢增长。拥塞窗口大于慢开始门限,就执行拥塞避免算法。“乘法减小”:指不论在慢开始还是拥塞避免阶段,只要出现超时重传就把慢开始门限值减半。"加分增大“:指执行拥塞避免算法后,使拥塞窗口缓慢增大,以防止网络过早出现拥塞。合起来叫AIMD算法。
3.快重传算法:发送方只要一连收到三个重复确认就应当重传对方尚未收到的报文。而不必等到该分组的重传计时器到期。
4.快恢复算法:(1)当发送端收到连续三个重复的确认时,就执行“乘法减小”算法,把慢开始门限 ssthresh 减半。但接下去不执行慢开始算法。(2)由于发送方现在认为网络很可能没有发生拥塞,因此现在不执行慢开始算法,即拥塞窗口 cwnd 现在不设置为 1,而是设置为慢开始门限 ssthresh减半后的数值,然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大.
7. TCP需要的系统资源比UDP多
8. TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
9. TCP 和 UDP SOCKET通信过程:
Tcp Server:
Socket() -> bind() -> listen() ->accept()->recv(),send()
Tcp client:
Socket() -> connect() -> send(),recv
TCP服务端流程如下:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt(); * 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、开启监听,用函数listen();
5、接收客户端上来的连接,用函数accept();
6、收发数据,用函数send()和recv(),或者read()和write();
7、关闭网络连接;
8、关闭监听;
TCP客户端流程如下:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、设置要连接的对方的IP地址和端口等属性;
5、连接服务器,用函数connect();
6、收发数据,用函数send()和recv(),或者read()和write();
7、关闭网络连接;
UDP SOCKET 通信过程:
Udp server:
Socket() -> bind() -> recvfrom()
Udp client
Socket() -> sendto()
UDP服务端流程如下:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、循环接收数据,用函数recvfrom();
5、关闭网络连接;
UDP客户端流程如下:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、设置对方的IP地址和端口等属性;
5、发送数据,用函数sendto();
6、关闭网络连接;
TCP流量控制和拥塞控制
流量控制避免了发送方的数据填满接收方的缓存。
拥塞控制:避免发送方的数据填满整个网络。