04 - TCP和UDP的认识和区别
本文主要分析运输层的两种协议TCP和UDP,重点在于TCP如何实现可靠传输,并且进行流量控制,以及TCP的三次握手和四次挥手的详细过程。最后对TCP和TDP的两种协议进行了比较。
TCP的拥塞控制已在另一篇博客 拥塞控制的基本方法 说明,本文不再赘述.
运输层就是位于应用层和网络层之间的,为运行在不同主机上的应用进程提供直接的通信服务是运输层的任务。
物理层、数据链路层以及网络层他们共同解决了将主机通过异构网络互连起来所面临的问题,实现了主机到主机的通信,而通信的真正实体是位于通信两端主机中的进程。
因特网的运输层为应用层提供了两种不同的运输协议,即面向连接的TCP和无连接的UDP
UDP是无连接的,不可靠的运输协议,TCP是面向连接的,可靠的运输协议
运输层在网络通信中的作用:
运输层在网络通信中作用过程:
注:这里所说的主机和主机之间的通信其实是主机进程之间的通信
用户数据报协议(User Datagram Protocol),是TCP/IP体系结构运输层中的一个重要协议,这种逻辑通信信道是一条不可靠信道。
特点:
说明:
TCP 是TCP/IP体系结构运输层中的重要协议,当运输层采用面向连接的 TCP 协议时,尽管下面的网络是不可靠的(只提供尽最大努力服务),但这种逻辑通信信道就相当于一条全双工的可靠信道。
TCP 传送的数据单位协议是 TCP 报文段(segment)
特点:
TCP传输过程
说明:
发送方:
接收方:
在TCP传输中为了实现可靠传输和流量控制都需要涉及超时重传,超时重传中最为重要的是计算超时重传的时间。
RTO是超时重传时间,RTT是往返时间。
超时重传时间不能远大于往返时间,会浪费资源
超时重传时间不能小于往返时间,会造成不必要的重传
超时重传时间应当略大于往返时间,为了避免误差,应当选用一段时间内的加权的往返时间
总结:
1、如果超时重传时间RTO的值设置得比RTT的值小很多,这会引起报文段不必要的重传,使网络负荷增大
2、如果超时重传时间RTO的值设置得远大于RTT0的值,这会使重传时间推迟的太长,使网络的空闲时间增大,降低传输效率
3、因此需要将超时重传时间设置的略大于一次往返时间。
超时重传时间的要略大于一次往返时间,但一次往返时间是不固定的,因此超时重传时间的计算是基于加权平均往返时间
说明:
往返时间RTT的测量不能简单的进行一次往返时间的计算,有如下问题需要处理
问题1:如果报文丢失或确认报文的迟到,都会导致重传报文。这样两次的报文发送使得无法准确计算一次往返时间。
解决1:Karn算法
问题2:
对于问题1的解决会引入新问题
解决2:
利用滑动窗口机制来实现流量控制,重点有两个,一个是接收方通过对已接收的数据进行累计确认,并调整窗口大小,来对发送方进行流控,第二个就是启动持续计时器来探知是否要发送零窗口探测报文,通过这两个就可以让接收方对发送方进行窗口大小的调控,以此做到了流量控制。
一般来说,我们总是希望数据传输的更快一些,但是如果发送方把数据发送的过快,接收方就可能来不及接收,这就会造成数据的丢失。所以就需要进行流量控制,
流量控制简单说就是让发送方的发送速率不要太快,要让接收方来得及接收
我们利用滑动窗口机制可以很方便的在TCP连接上实现对发送方的流量控制
重点在于接收方根据自己的存储空间来决定自己的接收空间的大小,以此来限制发送方发送窗口的大小
过程:
说明:
接收方给发送方发送的确认报文丢失后会形成A和B主机的相互等待,这样就造成了死锁,需要通过一个持续计时器,当计时器为0时发送零窗口探测报文询问以此让接收方再次发送确认报文。这样就打破了死锁
说明:
零窗口探测报文丢失后,是否仍然会死锁?
零窗口探测报文发送到主机B时,主机B的接收窗口为0,还能接收零窗口探测报文吗
可靠传输是通过确认机制来实现的,接收方给发送方发送的确认报文带有的字段决定了发送方是否要重传,是否要滑动窗口的操作,以此做到了可靠传输
说明:
TCP是面向连接的协议,它基于运输连接来传送TCP报文段,TCP运输连接的建立和释放是每一次面向连接的通信中必不可少的部分。
TCP的运输连接管理就是使运输连接的建立和释放都能正常的进行。
共有三个阶段
过程示意图:
说明:
为什么必须要三次握手,不能两次握手?
TCP双方已经建立了连接,后来,TCP客户进程所在的主机突然出现了故障,TCP服务器进程以后就不能再收到TCP客户进程发来的数据,因此,应当有措施使TCP服务器进程不要再白白等待下去。