运输层协议 |
TCP |
UDP |
面向连接 |
是 |
否 |
可靠数据传输 |
是 |
否 |
速度 |
慢 |
快 |
无连接运输:UDP
除了复用/ 分解功能及少量的差错检测外,它几乎没有对IP增加别的东西。UDP 从应用进程得到数据,附加上用于多路复用/分解服务的源和目的端口号字段,以及两个其他的小字段,然后将形成的报文段交给网络层。网络层将该运输层报文段封装到一个IP数据报中,然后尽力而为地尝试将此报文段交付给接收主机。该报文段到达接收主机,UDP 使用目的端口号将报文段中的数据交付给正确的应用进程
适合UDP的应用:
①实时应用
②无需连接建立(不会引入建立连接的时延)
③无连接状态(能支持更多的活跃客户)
④分组首部开销小(TCP需要20 字节的首部开销,而UDP 只需要8个字节)
DNS是一个通常使用UDP 的应用层协议
UDP的检验和提供了差错检测的功能,但是不能对差错进行恢复
TCP面向连接
TCP连接是面向连接的全双工服务,它也是点对点的,即在单个发送方与单个接收方之间的连接
TCP连接的建立:
客户首先发送一个特殊的TCP报文段,服务器用另一个特殊的TCP报文段来响应,最后,客户再用第三个特殊报文段作为响应,前两个报文段不承载“有效载荷”,也就
是不包含应用层数据;而第三个报文段可以承载有效载荷(发送了三个报文段:三次握手)
三次握手的原因:为发送大量数据做好准备。
更为详细:
客户应用进程首先通知客户TCP,它想建立一个与服务器上的某个进程之间的连接
第一步:客户端的TCP首先向服务器端的TCP发送一个特殊的TCP报文段。该报文段不包含应用层数据,报文段的首部SYN 被置为 1 ,客户随机选择一个初始序号(
client_isn),并将此编号放置于该其实的TCP SYN 报文段的序号字段中。该报文段会被封装在一个IP数据报中,并发给服务器
第二步:TCP SYN 报文段的 IP数据报到达服务器主机,服务器会从该数据报中提取出 TCP SYN 报文段,为该TCP连接分配TCP缓存和变量,并向该客户发送允许连
接的报文段(不包括应用层数据)。SYN比特置为1;TCP报文段首部的确认字段被置为 client_isn + 1 ;服务器选择自己的初始序号,并将其放置到TCP报文段首部的序号字段
中。允许连接的报文段有时被称为 SYNACK 报文段
第三步:在收到SYNACK报文段后,客户也要为该连接分配缓存和变量,客户向服务器发送另外一个报文段——对服务器的允许连接的报文段进行了确认(通过将值
server_isn + 1 放置到TCP报文段首部的确认字段);因为连接已经建立,所以该SYN 比特被置为0.该阶段的报文段可以负载客户到服务器的数据
客户和服务器就可以相互发送包括数据的报文段。在以后每一个报文段中,SYN比特都被置为0
客户进程向服务进程发送数据:
客户进程通过套接字传递数据流,数据一旦通过该门,它就由客户中运行的TCP控制了。TCP将这些数据引导到该连接的发送缓存里,接下来TCP就会不时从发送缓存里
取出一块数据,TCP为每块客户数据配上一个TCP首部,从而形成多个TCP报文段。这些报文段被下传给网络层,网络层将其分别封装在网络层IP数据报中,在TCP另一端收到一
个报文段后,该报文段的数据就被放入该TCP连接的接收缓存中。
可靠数据传输机制:
①
检验和:检测传输分组中的比他是否发生错误
②
定时器:用于超时/重传一个分组,接收方可能会接收到一个分组的多个冗余副本
③
序号:用于为发送方流向接收方的数据分组按序号编号,具有相同序号的分组可使接收方检测出一个分组的冗余副本
④
确认:接收方用于发送方一个分组或一组分组已经被正确接收
⑤
否定确认::接收方用于高速发送方某个分组未被正确的接收
⑥
窗口、流水线:发送方被限制仅发送那些序号落在一个指定范围内的分组
TCP传输机制恢复差错采用回退N步和快速重传的混合体
TCP拥塞控制算法:
①慢启动:
每过一个RTT,根据接受到确认报文数,发送速率就翻番。因此,TCP发送速率起始慢,但在慢启动阶段以指数增长
何时结束这种指数增长:
第一种方式:存在一个由超时指示的丢包事件(即拥塞),TCP发送方将cwnd设置为1并重新开始慢启动过程;还将第二个状态变量的值 ssthresh(“慢启动
阙值”的速记)设置为 cwnd/2,即当检测到拥塞时将ssthresh 置为拥塞窗口值的一半
第二种方式:直接与ssthresh的值相关联,当检测到cwnd 的值等于ssthresh时,结束慢启动并且TCP转移到拥塞避免模式
第三种方式:检测到3个冗余的ACK,这是TCP执行一种快速重传并进入快速恢复状态
②拥塞避免:
一旦进入拥塞避免状态,cwnd 的值大约是上次遇到拥塞时的值的一半。每个RTT 只将cwnd的值增加一个MSS( 对于TCP发送方无论何时到达一个新的确认,就
将cwnd增加一个(MSS/cwnd)字节, 如果MSS 是140字节并且cwnd是14600字节,则在一个RTT内发送10个报文段。每个到达ACK 增加 1/10MSS的拥塞窗口长度,因此在收到对所
有10个报文段的确认后,拥塞窗口的值将增加了一个MSS)
何时结束拥塞避免的线性增长
当出现超时时,TCP拥塞避免算法行为相同。与慢启动一样,cwnd的值被设置为1个MSS,当丢包时间出现时,ssthresh的值被更新为cwnd的值的一半
当出现有三个冗余ACK事件触发时,网络继续从发送方向接收方交付报文段:TCP将cwnd的值减半(收到的3个冗余ACK要加上3个MSS),并且当收到3个
冗余的ACK,将ssthresh的值记录为cwnd的值的一半。接下来进入快速恢复状态
③快速恢复:
在快速回复中,对于引起TCP进入快速回复状态的确实报文段,对收到的每个冗余的ACK,cwnd的值增加一个MSS。最终,当对丢失报文段的一个ACK到达时,
TCP在降低cwnd后进入拥塞避免状态。如果出现超时事件,快速回复在执行如同慢启动和拥塞避免中相同的动作后,迁移到慢启动状态:当丢包时间出现时,cwnd的值被设置
为一个MSS,并且ssthresh 的值设置为cwnd值的一半(如果阈值是8,则当到达阈值后,会出现3个冗余的ACK,当丢包事件发生是,拥塞窗口的值为12* mss,于是ssthresh的
值被设置为 0.5 * cwnd = 6MSS)