TCP与UDP解释与区别

在OSI和TCP/IP模型下,传输层定义两种传输协议:TCP(传输控制协议,transmission control  protocol)和UDP(用户数据报协议user datagram protocol

TCP是一种可靠的,面向连接的,基于字节流的传输层通信协议;

UDP是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。

TCP数据包在接收无序,丢失或者在交付期间被破坏时,负责数据恢复。

为确保正确的收到数据,TCP要求在目标计算机成功收到数据时发挥一个确认(即ACK),如果在某个时限内未成功收到ACK,将重新发送数据包。在网络拥塞时,这种重新传送机制会导致发送的数据包重复,但是目标计算机可以使用数据包的序号来判断是否为重复数据包,并在必要的时候丢其它。

UDP:强调性能,音频和多媒体应用

TCP:强调数据完整性,可控制性和可靠性

区别:

一.TCP提供面向连接的,可靠的数据流传输;UDP提供非面向连接的,不可靠的数据流传输,采用无连接

(最主要的区别,UDP不一定提供可靠的数据传输)

二.TCP传输单位成为TCP报文段;UDP传输单位成为用户数据报

扫描二维码关注公众号,回复: 900693 查看本文章

三.TCP注重数据安全性;UDP安全性一般,但是数据传输快,因为不需要连接等待,少了许多操作

四.TCP对应的协议:

  1. FTP:定义了文件传输协议,使用了21端口
  2. Telnet:一种用于远程登录的端口,使用23端口,用户可以将自己的身份远程连接到计算机上,可提供基于DOS模式下的通信服务
  3. SMTP:邮件传送协议,用于发送邮件,服务器开放的是25号端口
  4. POP3:它是和SMTP相对应的,用于接收邮件,使用的是110号端口
  5. HTTP:是从WEB服务器传输超文本到本地浏览器的传送协议

UDP对应的协议:

  1. DNS:用于域名解析服务,将域名地址转换成IP地址,DNS用的是53号端口
  2. SNMP:简单网络管理协议,使用161号端口,用于管理网络设备,由于网络设备很多,无连接的服务就体现出优势
  3. TFTP:简单文件传输协议,该协议在熟知端口69上使用UDP服务

 

UDP协议:

  UDP(User Datagram Protocol)即用户数据报协议,其传输机制决定了它的最大优点——快,同时也决定了它最大的缺点——不可靠、不稳定。

  UDP是无连接的,发送数据之前不需要建立连接(TCP需要)。减少了开销和延时。

  UDP是面向报文的,对IP数据报只做简单封装(8字节UDP报头)。减少报头开销。

  UDP没有阻塞机制,宁愿阻塞时丢弃数据不传,也不阻塞造成延时。

  UDP支持一对一、一对多、多对一、多对多通信。

    

  UDP报文结构:

    

 

 

 

TCP协议:

  TCP(Transmission Control Protocol)传输控制协议,相对于UDP,TCP是面向连接的、提供可靠的数据传输服务。同时也是较UDP开销较大的、传输速度较慢的。

  TCP提供可靠的、面向连接的数据传输服务。使用TCP通信之前,需要进行“三次握手”建立连接,通信结束后还要使用“四次挥手”断开连接。

  TCP是点对点的连接。一条TCP连接只能连接两个端点。

  TCP 提供可靠传输,无差错、不丢失、不重复、按顺序。

  TCP 提供全双工通信,允许通信双方任何时候都能发送数据,发送方设有发送缓存,接收方设有接收缓存。

  TCP 面向字节流 。TCP 并不知道所传输的数据的含义,仅把数据看作一连串的字节序列,它也不保证接收方收到的数据块和发送方发出的数据块具有大小对应关系。

 

  TCP报文结构:

  

  TCP是面向字节流的,通过 TCP 传送的字节流中的每个字节都按顺序编号,而报头中的Sequence Number字段值则指的是本报文段数据的第一个字节的序号。Acknowledgment Number是期望收到对方下个报文段的第一个数据字节的序号。

  Offset:占4位,指 TCP 报文段的报头长度,包括固定的20字节和TCP Options字段。

  Reserved:占6位,保留为今后使用,目前为0。

  TCP flags的C、E、U、A、P、R、S、F字段用来说明该报文的性质。意义如下: 

    C(CWR)和E(ECE)用来支持ECN(显示阻塞通告)。

    U(URGENT):当 URG=1时,它告诉系统此报文中有紧急数据,应优先传送(比如紧急关闭),这要与紧急指针字段配合使用。

    A(ACK):仅当 ACK=1时确认号字段才有效。建立 TCP 连接后,所有报文段都必须把 ACK 字段置为 1。

    P(PUSH):若TCP连接的一端希望另一端立即响应,PSH字段便可以“催促”对方,不再等到缓存区填满才发送。

    R(RESET):若 TCP 连接出现严重差错,RST 置为 1,断开 TCP 连接,再重新建立连接。

    S(SYN):用于建立和释放连接,当SYN=1时,表示建立连接。

    F(FIN):用于释放连接,当 FIN=1,表明发送方已经发送完毕,要求释放TCP 连接。

  Window:占2个字节。窗口值是指发送者自己的接收窗口大小,因为接收缓存的空间有限。 

  CheckSum:占2个字节。和UDP报文一样,有一个检验和,用于检查报文是否在传输过程中出差错。

  Urgent Pointer:占2字节。当URG=1时才有效,指出本报文段紧急数据的字节数。

 

  TCP建立连接的三次握手:

  

 

  (1)Client首先向Server发送连接请求报文段,同步自己的seq(x),Client进入SYN_SENT状态。

  (2)Server收到Client的连接请求报文段,返回给Client自己的seq(y)以及ack(x+1),Server进入SYN_REVD状态。

  (3)Client收到Server的返回确认,再次向服务器发送确认报文段ack(y+1),这个报文段已经可以携带数据了。Client进入ESTABLISHED状态。

  (4)Server再次收到Client的确认信息后,进入ESTABLISHED状态。

  TCP连接至此建立起来了。为什么要做三次握手呢?握手的过程实际上是在通知对方自己的初始化序号(Initial Sequence Number),简称ISN,也就是上图中的x和y。x和y会被当作之后传输数据的一个依据,以保证TCP报文在传输过程中不会混乱。

  我们回到TCP Header结构来看,Sequence Number和Acknowledgment Number都是占32位,所以seq和ack的取值范围是0 ~ 2^32-1。seq和ack每增加到2^32-1,则重新从0开始。值得一提的是,seq的初始值(ISN)并不是每次都从0开始的。我们设想一下,如果是从0开始,那么当TCP三次握手建立连接完成后,Client发送了30个报文,然后Client断线了。于是Client重连,再次用0作为初始的seq,这样就会出现两个报文具有相同的seq,就出现了混乱。事实上TCP的做法是每隔4微秒就对ISN做一次加1操作,当ISN到达2^32-1后再次从0开始的时候,已经过去了几个小时,之前的seq=0的报文已经不存在于这次连接中了,这样就避免了上面的问题。

  

  TCP断开连接的四次挥手:

  

  (1)Client向Server发送断开连接请求的报文段,seq=m(m为Client最后一次向Server发送报文段的最后一个字节序号加1),Client进入FIN-WAIT-1状态。

  (2)Server收到断开报文段后,向Client发送确认报文段,seq=n(n为Server最后一次向Client发送报文段的最后一个字节序号加1),ack=m+1,Server进入CLOSE-WAIT状态。此时这个TCP连接处于半开半闭状态,Server发送数据的话,Client仍然可以接收到。

  (3)Server向Client发送断开确认报文段,seq=u(u为半开半闭状态下Server最后一次向Client发送报文段的最后一个字节序号加1),ack=m+1,Server进入LAST-ACK状态。

  (4)Client收到Server的断开确认报文段后,向Server发送确认断开报文,seq=m+1,ack=u+1,Client进入TIME-WAIT状态。

  (5)Server收到Client的确认断开报文,进入CLOSED状态,断开了TCP连接。

  (6)Client在TIME-WAIT状态等待一段时间(时间为2*MSL((Maximum Segment Life)),确认Client向Server发送的最后一次断开确认到达(如果没有到达,Server会重发步骤(3)中的断开确认报文段给Client,告诉Client你的最后一次确认断开没有收到)。如果Client在TIME-WAIT过程中没有再次收到Server的报文段,就进入CLOSES状态。TCP连接至此断开。

  

  TCP连接可靠性的体现:

  (1)TCP报文段的长度可变,根据收发双方的缓存状态、网络状态而调整。

  (2)当TCP收到发自TCP连接另一端的数据,它将发送一个确认。

  (3)当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段,如果不能及时收到一个确认,将重发这个报文段。

  (4)TCP将保持它首部和数据的检验和。如果通过检验和发现报文段有差错,这个报文段将被丢弃,等待超时重传。

  (5)TCP将数据按字节排序,报文段中有序号,以确保顺序的正确性。

  (6)TCP还能提供流量控制。TCP连接的每一方都有收发缓存。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。

  需要注意的是,TCP报文传输采用接受后返回确认的方式来保证报文传输的可靠性,并不是意味着发送方在发送一个报文段后就进入等待确认状态,让后面的报文段等着。也不是接收方在接收到一个报文后,对每一个报文都进行回复确认。

  真实的情况是,对于发送方,在发送一个报文段后,复制一份该报文段的副本,然后继续进行下一个报文段的发送,如果没有得到发送方的回复确认,就对该报文段进行超时重发。对于接收方来说,则采用“积累确认”的方式进行回复。接收者收到多个连续的报文段后,只回复确认最后一个报文段,表示在这之前的数据都已收到。以此达到提升传输效率的目的。

 

  TCP的流量控制和阻塞控制:

  由于接收方缓存的限制,发送窗口不能大于接收方接收窗口。在报文段首部有一个字段就叫做窗口(rwnd),这便是用于告诉对方自己的接收窗口,可见窗口的大小是可以变化的。 

  

  总结起来如上图,TCP的流量和阻塞控制采用“慢启动”、“加性增”、“乘性减”的策略。

  慢启动:初始的窗口值很小,但是按指数规律渐渐增长,直到达到慢开始门限(ssthresh)。

  加性增:窗口值达到慢开始门限后,每发送一个报文段,窗口值增加一个单位量。

  乘性减:无论什么阶段,只要出现超时,则把窗口值减小一半。

猜你喜欢

转载自blog.csdn.net/n1neding/article/details/79932382
今日推荐