Web时代 -TCP与UDP

384 阅读7分钟

在介绍TCP与UDP之前我们先看下计算机网络分层模型。OSI七层网络模型和TCP/IP四层概念模型,以及对应的网络协议

TCP: 传输协议TCP

UDP:用户数据协议UDP

图片

TCP

TCP服务模型包括面向连接服务和可靠数据传输服务。当某个应用程序调用TCP作为其运输协议时,该应用程序就能获得来自TCP的这两种服务。

  • 面向连接服务:在应用层数据报文开始流动之前,TCP让客户和服务器相互交换运输层控制的信息。这个握手过程提示客户端和服务端做好准备。在握手阶段一个TCP连接就是两个进程的套接字之间建立了,这个过程是双工的。即连接双方的进程可以在此连接上同时进行报文的收发。当应用程序结束报文发送时,必须拆除该连接。

  • 可靠的数据传输服务:通信进程能够依靠TCP,无差错,按适当的顺序交互所有的数据,当应用程序的一端将字节流传进套接字时。他能够依靠TCP将相同的字节流交互到接受方的套接字,而没有字节的丢失和冗余。

TCP连接

图片

TCP连接的建立过程主要解决以下3个问题:

  1. 要使每一方都能够确定对方的存在

  2. 要允许双方协商一些参数(如:最大的窗口值,)

  3. 能够对运输实体资源进行分配。

TCP 三次握手四次挥手原理

在谢希仁著《计算机网络》第四版中讲“三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”。在另一部经典的《计算机网络》(Andrew S.Tanenbaum著,第四版)一书中讲“三次握手”的目的是为了解决“网络中存在延迟的重复分组”的问题。这两种不同的表述其实阐明的是同一个问题。

图片

cQP1i9.png

  • 第一次握手:建立连接,客户端发送sync包(sync=x)到服务器,并进入SYN_SENT状态等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)   。。首部的同步位SYN=1,初始序号seq=x,SYN=1的报文段不能携带数据,但要消耗掉一个序号。

  • 第二次握手:服务器收到客户端的Syn包,必须确认客户的SYN(ack=x+1) 同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;在确认报文段中SYN=1,ACK=1,确认号ack=x+1,初始序号seq=y

  • 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1)发送完毕后,客户端和服务端进入ESTABLISHED(TCP连接成功)状态,完成三次握手。确认报文段ACK=1,确认号ack=y+1,序号seq=x+1(初始为seq=x,第二个报文段所以要+1),ACK报文段可以携带数据,不携带数据则不消耗序号。

TCP为何采用三次握手而不是采用两次握手呢

现在这个有两种解释:第一种是网上流传的:

     3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。

     现在把三次握手改成仅需要两次握手,死锁是可能发生的。作为例子,考虑计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发 送了确认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S 是否已准备好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分 组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁

第二种是谢希仁版的《计算机网络》中的例子:

图片

cQiMOf.png

注:上图黄色部分说明了为什么不可以使用两次握手的问题。

TCP为什么连接的时候是三次握手,关闭的时候却是四次握手?

先看下四次挥手的释放连接的过程。以下来源于谢希仁编著的《计算机网络》(第七版)

图片

cQFu4J.png

图片

cQFQ3R.png

那么就来解答为何关闭时需要四次握手?

因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

如果建立了连接,但客户端突然出现故障怎么办?

TCP还设有一个保活计时器,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

UDP

UDP是一个不提供不必要服务的轻量级运输协议,他仅提供最小服务,UDP是无连接的,因此在两个进程通信没有握手过程中。UDP协议提供一种不可靠数据传输服务,也就是说,当进程将一个报文发送进UDP套接字时,UDP协议并不保证该报文将到达进程,同时也不保证报文的顺序。UDP使用尽最大努力交付UDP是面向报文的。

UDP没有包含拥塞控制机制,所以UDP的发送端是可以用它选定的任何速率向下层(网络层)注入数据,

UDP支持一对一,一对多,多对一和多对多的交互通信

UDP的首部开销小,只有8字节,比TCP的20字节的首部要短

图片

cMokdS.png

TCP与UDP区别

  • TCP是面向连接的;UDP是无连接的,即发送数据之前不需要建立连接。

  • TCP提供可靠的服务。通过TCP连接传输的数据,无差错,不丢失,不重复,且按序到达;UDP尽量保证到达,不保证可靠交互。

  • TCP是面向字节流,实际tcp连接传送的数据可看成一连串的无结构的字节流;UDP是面向报文的,UDP没有阻塞控制,因此网络出现拥堵不会使得源主机发送效率降低(实时应用有用)

  • 每条TCP连接只能点对点,UDP支持一对一,一对多,多对多的交互通信。

  • TCP首部开销20字节;UDP的首部开销小,只有8个字节

  • TCP的逻辑通信信道是双全工的可靠的信道,UDP则是不可靠信道。

以上就是结合计算机网络知识,重新回顾整理的TCP与UDP的知识概念。如果喜欢我的内容请加关注,分享。

图片

面向对象Coding

面向对象Coding

个人编程总结

47篇原创内容

公众号