运输层服务

运输层协议为在不同主机上的应用进程之间提供了逻辑通信功能

网络层提供了主机之间的逻辑通信,而运输层为运行在不同主机上的进程之间提供了逻辑通信

因特网运输层为应用层提供了UDP和TCP协议

网络层有个协议是IP协议,即网际协议

UDP和TCP最基本的责任是:将两个端系统间IP的交付服务拓展为运行在端系统上的两个进程之间的交付服务。

将主机间交付拓展到进程间交付被称为运输层的多路复用和多路分解

多路复用与多路分解

将运输层报文端中的数据交付到正确的套接字工作称为多路分解

在源主机从不同套接字中收集数据库,并为每个数据块封装上首部信息从而生成报文段,然后将报文段传递到网络层,所有这些工作称为多路复用

UDP

UDP仅仅做了运输协议的最少工作,除了复用/分解功能及少量差错检测外,几乎就没有对IP增加新的东西

使用UDP时,在发送报文段之前,没有握手,所以称UDP无连接

DNS是一个使用UDP的应用层协议的例子

使用UDP的原因:

  • 关于发送什么数据及何时发生的应用层控制更加精细
  • 无需建立连接
  • 无连接状态
  • 分组首部开销小

UDP报文结构

UDP报文结构

UDP校验和提供了差错校验过程

发送方的UDP对报文段中的16比特字的和进行反码运算,求和时若溢出则回卷(取反)。结果放在校验和字段

检错:接收方将全部的16比特字加在一起,如果没错,和将是1111 1111 1111 1111,如果有零说明错了

可靠数据传输

靠理解 看书吧

TCP

TCP是面向连接的,在一个进程向另一个进程发送数据之前,这两个进程必须先互相握手

TCP连接总是点对点

三次握手机制:

  • 客户先发送一个特殊的TCP报文段
  • 服务器用一个特殊的TCP报文段响应
  • 客户用第三个特殊的报文段作为响应

前两个报文不承载有效荷载,也就是不包含应用层数据,第三个报文可以承载有效荷载

一旦连接建立,可以互相发数据

报文结构

IMG_BF169C3436CF-1

TCP首部一般是20字节

包含:

  • 32bit序号字节和32bit确认号字节
  • 16bit的接收窗口字节
  • 4bit首部长度字段
  • 可选、可变的选项字段
  • 6bit的标志字段

往返时间的估计和超时

估计往返时间

报文段的样本RTT(SampleRTT)就是从某报文段被发出到该报文段被确认的时间量

大多数TCP实现仅在某个时刻做一次SampleRTT测量

SampleRTT的均值称为EstimatedRTT

$\text{EstimatedRTT}=(1-\alpha)\cdot+\alpha \cdot \text{SampleRTT}$

DevRTT用于估算SampleRTT会偏离EstimatedRTT的程度

$\text{DevRTT}=(1-ß)\cdot \text{DevRTT}+ß \cdot \left|{ {\text{SampleRTT}- \text{EstimatedRTT}}}\right|$

TCP的超时间间隔用TimeoutInterval表示

$\text{TimeoutInterval} = \text{EstimatedRTT}+4 \cdot \text{DevRTT}$

流量控制

TCP为他的应用程序提供了流量控制服务以消除发送方使接收方缓存溢出的可能性

通过让发送方维护一个称为接收窗口的变量来提供流量控制

假设A向B建立一条TCP连接发送一个大文件,B为连接分配一个接收缓存,用RcvBuffer表示

定义以下变量

  • LastByteRead:主机B上的应用进程从缓存独处数据流的最后一个字节的编号
  • LastByteRcvd:从网络中到达的并且已经放入主机B接收缓存中的数据流的最后一个字节的编号

由于TCP不允许已分配的缓存溢出,则有 $\text{LastByteRcvd} - \text{LastByteRead}\leq \text{RcvBuffer}$

接收窗口用rwnd表示,根据缓存可用空间的数量来设置:$\text{rwnd}=\text{RcvBuffer} - [\text{LastByteRcvd} - \text{LastByteRead}]$

关闭连接

当要关闭连接时,TCP客户端向服务器进程发送一个特殊的TCP报文段,这个报文段的首部标志位即FIN比特被设置为1,然后服务器也发回一个报文,FIN比特被置为1,最后客户确认这个服务器连接都终止了