传输层架构在网络层提供的服务之上,把数据传递服务从两台计算机之间扩展到两台计算机的进程之间。并且服务所需的可靠性程度独立于当前使用的物理网络。传输层为应用层使用网络提供了抽象的模式。
与网络层提供面向连接和无连接两种服务一样,传输层的服务类型也分为两种。面向连接的传输服务在许多方面与面向连接的网络服务类似,两者都要经历连接建立、数据传输和连接释放三个阶段。另外,无连接的传输服务与无连接的网络服务也极为相似。
于是,既然传输层服务与网络层服务如此相似,为什么还需要设立两个独立的层?
原因是因为传输层的代码完全运行在用户的机器上,但是网络层代码主要运行在由运营商操作的路由器上(至少对广域网是如此)。如果网络层提供的服务不够用,怎么办?如果它频繁的丢失数据包怎么办?如果路由器时常崩溃怎么办?
用户对网络层没有真正的控制权,因为他们不拥有路由器,所以不能用更好的路由器或者在数据链路层上用更好的错误处理机制来解决服务太差的问题。唯一可能是在网络层之上再加一层,由该层来提高网络的服务质量。
本质上,由于传输层的存在,是的传输服务有可能比网络服务更加可靠。而且传输服务原语可以通过调用库程序来实现,从而使得这些原语独立于网络服务原语。
正是有了传输层,应用程序员才可以按照一组标准的原语来编写代码,并且程序可以运行在各种各样的网络上,他们不需要处理不同的网络接口,也不用担心传输的可靠性。
多路复用和多路分解
多路复用是将从源主机不同的套接字收集到的数据,为每个数据块封装好首部信息,生成报文,然后将报文传递到网络层。
多路分解是将传输层收到的报文字段分解到正确的套接字中。
UDP用户数据报协议
UDP是一个简单的面向数据报的传输层协议:进程的每一个输出操作都正好产生一个UDP数据报,并组装成一份待发送的IP数据报。
UDP不提供可靠性:它把应用程序传给IP层的数据发送出去,但是并不保证它们能到达目的地。
UDP报文结构:
UDP报文首部只有四个字段,每个字段有占两个字节,共占8个字节。
其中源端口号和目的端口号分别表示发送进程和接收进程;长度表示UDP首部和UDP数据的字节长度,该字段的最小值为8字节(发送一份0字节的UDP数据报是允许的);
UDP特点
- UDP是无连接,面向报文的;
- UDP没有拥塞控制,可能会导致发送方和接收方之间的高丢包率,并挤垮TCP会话;
- UDP首部开销小,只有8个字节
广播和多播
IP地址分为三种:单播地址、广播地址和多播地址。
广播和多播仅应用于UDP,它们对需将报文同时传往多个接受者的应用来说十分重要。
如果一台主机需要向网上的所有其他主机发送帧,这就是广播。
多播处于单播和广播之间:帧仅传送给属于多播组的多个主机。
使用广播的问题在于它增加了对广播数据不感兴趣的主机的处理负荷。拿一个使用UDP广播应用作为例子,如果网内有50个主机,但仅有20个参与应用,每次这20个主机中的一个发送UDP广播数据时,其余30个主机不得不处理这些广播数据报,一直到UDP层,收到的UDP广播数据报才会被丢弃。这30个主机丢弃UDP广播数据报是因为这些主机没有使用这个目的端口,多播的出现减少了对应用不感兴趣主机的处理负荷。使用多播,主机可以加入一个或多个多播组。这样,网卡将获悉该主机属于哪个多播组,然后仅接收主机所在多播组的那些多播帧。
- 受限的广播:地址是255.255.255.255。该地址用于主机配置过程中IP数据报的目的地址,在任何情况下,路由器都不转发目的地址为受限的广播地址的数据报,这样的数据报仅出现在本地网络中。
- 指向网络的广播:是指主机号为全1 的地址。
- 指向子网的广播:主机号为全1,且有特定子网号的地址
TCP传输控制协议
TCP协议是面向连接,提供可靠的字节流服务,提供全双工通信,面向字节流的。
面向连接意味着两个使用TCP的应用在彼此交换数据前必须先建立一个TCP连接。
TCP通过以下方式提供可靠性:
- 应用数据被分割成TCP认为最合适发送的数据块。由TCP传递给IP的信息成为报文段或段(segment);
- 当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
- 当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒;
- TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段;
- 既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层;
- 既然IP数据报会发送重复,TCP 的接收端必须丢弃重复的数据;
- TCP 还能提供流量控制,TCP连接的每一方都有固定大小的缓冲空间。TCP接收端只允许另一端发送接收端缓冲区所能接纳的数据,防止较快主机致使较慢主机的缓冲区溢出。
对TCP报文结构各个字段的解释
- 源端口和目的端口: 分别占用两个字节,用于寻找发端和收端的应用程序。这两个值加上IP首部中的源端IP地址和目的端IP地址唯一确定一个TCP连接;
- 序号:占用四个字节,TCP传输的字节流中,每个字节都是按顺序进行编号,传输的字节流起始序号必须在建立连接时指定。首部中的序号字段值是本报文段所发送的数据的第一个字节的序号。eg. 一报文序号字段的值为101,数据共有100个字节,那么下一个报文序号字段的值为201。由于序号字段占4个字节,所以其大小的取值范围是
[0,232−1] ,超出了序号字段值的取值范围的话,循环从0开始。 - 确认号: 占4个字节,期望收到对方下一个报文的第一个数据字节的序号。
- 数据偏移: 指出TCP报文段的数据起始处距离TCP首部的起始处有多远,实际上就是支出TCP首部长度。数据偏移占据4个二进制位,故该字段最大值是15。数据偏移的单位是4个字节,故首部最大只能是15*4=60个字节(其中前20个字节是固定的)。
- 紧急URG:
- 确认ACK:等于1时,确认号字段才有效。TCP规定连接建立后所有传送报文中,必须把ACK置为1。
- 推送PUSH:表明需要尽快交付接收应用程序,不再等整个缓存都填满后再向上交付;
- 复位RST:等于1时表明TCP连接中出现严重差错,必须释放连接再重新建立。
- 同步SYN:用于连接建立时同步序号的
- 终止FIN:用于释放一个连接。
- 窗口:占用2个字节,该字段用于流量控制,指示接收方愿意接收的字节数量。因为接收方的接收缓存有限,所以窗口值是动态变化的。
- 检验和:占2个字节
- 紧急指针:占2个字节,指出紧急数据的末尾在报文段中的位置。及时窗口值为0,也可以发送紧急数据。
TCP协议的可靠传输机制
TCP协议的可靠传输机制主要依靠:
- 报文确认:TCP协议规定,接收方对于正确接收到的来自发送方的报文段要给与确认返回报文。该报文中的首部ACK指向接收方期待下一个开始接收的字节。
- 超时重传:当发送方发送报文之后,会启动一个倒数计时器(超时重传的时间间隔),计时器为零时,就认为报文可能在网络中丢失,需要重传。
- 快速重传:超时触发重传存在的另一个问题就是超时周期可能相对较长。这种超时周期迫使发送方等待很长时间才重传丢失分组。为避免这种情况,发送方可以通过荣誉ACK较好的检测丢包情况。如果TCP发送方接收到相同数据的3各冗余ACK,就认为这个已被确认过3此的报文段之后的报文段已经丢失,一旦受到3个冗余ACK,TCP就执行快速重传。
-
差错恢复:
TCP差错恢复方法有两种:
- 回退N步(GBN协议): 即滑动窗口协议。如果出现超时,发送方将重传所有已经发送但未确认的分组。在GBN协议中,接收方会丢弃所有失序的分组,即使前面在失序分组前已经有好几个分组正确到达了。
- 选择重传(SR协议):不同于GBN协议,选择重传协议通过让发送方仅重传它换衣在接收方出错的分组而避免不必要的重传。
TCP协议的流量控制
TCP为应用程序提供流量控制服务,以消除发送方是接收方缓存溢出的可能性。所以流量控制是一个速度匹配服务,即发送方的发送速率与接收方应用程序的读速率相匹配。
TCP协议报文结构中的窗口字段就是用于流量控制的。
要将发送方的已发送未确认的分组控制在接收方给出的窗口大小内,考虑当接收方返回的window值为0时,发送方就不能再进行发送了,而发送方不进行发送,当接收方有缓存窗口不为零时就无法得知,因为接收方不会主动推送窗口值。所以TCP规定,当发送方收到窗口值为-时的报文,就开启一个计时器,时间一到就主动去发送一个只有一个字节的探测报文段,这时候,接收方就把新的窗口值加上ACK报文段上进行返回。
TPC协议的拥塞控制
TCP协议的连接管理
- 建立连接(三次握手):
- 客户端向服务器发送一个特殊的TCP报文段。该报文段不包含应用层数据,但需要把报文段首部的SYN标志位置1,同时还需要加上SEQ字段指示客户端的开始序号。该报文段可以被称为SYN报文段
- 服务器收到SYN报文之后,就为该TCP连接分配TCP缓存和变量,并向客户端发送允许连接的报文段。该报文段包含SYN和SEQ,意义同上。但还附带一个ACK指示想要收到的下一个字节。该报文段可以被称为SYNACK报文段
- 在收到SYNACK报文段后,客户机也要给该连接分配缓存和变量。这时客户端还会向服务端发送另一个报文段,是对SYNACK报文段进行确认。因为连接已经成功建立,所以SYN被置0.
一旦建立连接成功,双方就可以互相发送含有数据的报文段,并且这些报文段的SYN都置为0。
- 断开连接(四次挥手)
当客户端应用程序发出一个关闭连接的请求,会向服务器进程发送一个特殊的TCP报文段。该报文段中FIN位置为1。
当服务器收到该FIN报文段后,就向客户端发送一个确认ACK报文段,确认序号为收到序号加1。这时,TCP连接处于半关闭状态,半关闭状态是指客户端已经不能给服务端发送数据了,但可以接收服务端发过来的数据。
数据传输完毕后,服务器发送其终止报文段,同样FIN置1。
最后客户端对这个服务端的终止报文段进行确认后,两台主机的TCP连接成功断开。
TCP长连接和短连接
在网络通信中采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时可以释放这个连接,连接的简历需要三次握手,释放需要四次挥手,所以每次连接的建立都是需要资源消耗和时间消耗。
- TCP短连接:短连接一般只会在client/server之间传递一次读写操作便会关闭连接。其优点是管理比较简单,存在的连接都是有用的连接,不需要额外的控制手段。
- TCP长连接:client和server完成一次读写后,并不会关闭连接,后续的读写操作会继续使用这个连接。这里需要提到TCP保活功能,保活功能主要为服务器提供,如果客户端已经消失,使得服务器上保留一个半开放的连接,而服务器又在等待来自客户端的数据,则服务器将永远等待客户端的数据,保活功能就是试图在服务器端检测这种半开放的连接。如果一个给定的连接在一段时间内没有任何动作,则服务器就向客户端发送一个探测报文,如果正常收到客户端的响应,则会继续维持连接,否则会断开连接。
TCP的超时与重传
TCP提供可靠的传输层。它使用的方法之一就是确认从另一端收到的数据,但是数据和确认都有可能丢失。TCP通过在发送时设置一个定时器来解决这种问题。如果在定时器溢出时,还没有收到确认,它就重传该数据。
对任何实现而言,关键之处在于超时和重传的策略,即怎样决定超时时间间隔和如何确定重传的频率。
对每个连接,TCP管理4各不同的定时器:
- 重传定时器,使用于当希望收到另一端的确认
- 坚持(persist)定时器,使窗口大小信息保持不断流动,即使另一端关闭了其接受窗口
- 保活(keepalive)定时器,可以检测到一个空闲连接的另一端何时崩溃或重启
- 2MSL定时器测量一个连接处于TIME_WAIT状态的时间。