学习笔记之计算机网络(王道考研) 第五章 传输层

  • 传输层属于面向通讯的最高层,同时也是用户功能中的最低层
  • 传输层提供应用进程之间的逻辑通讯(即端到端的通讯),与网络层的区别是,网络层提供的是主机之间的逻辑通讯
  • 传输层的复用和分用:复用是指发送方不一样的应用进程均可以使用同一个传输层协议传送数据;分用是指接收方的传输层在剥去报文的首部后可以把这些数据正确交付到目的应用进程
  • 传输层还要对收到的报文进行差错检测(首部和数据部分),而网络层只检查IP数据报的首部(首部校验和),不检验数据不符是否会出错
  • 提供两种不一样的传输协议,即面向链接的TCP和无链接的UDP。而网络层没法同时实现两种协议(即在网络层要么只提供面向链接的服务,如虚电路,要么只提供无链接服务,如数据报,而不可能在网络层同时存在这两种方式)
  • 服务访问点(SAP):数据链路层的SAP是MAC地址,网络层的SAP是IP地址,传输层的SAP是端口
  • 服务端使用的端口号:分两种。一类为熟知端口号,数值为0~1023,这些端口号被指定给了TCP/IP最重要的一些应用程序;另外一类叫作登记端口号,数值为1024~49151,它是为没有熟知端口号的应用程序使用的,使用这类端口号必须在IANA登记
  • 一些经常使用的熟知端口号以下:
应用程序 FTP TELNET SMTP DNS TFTP HTTP SNMP
熟知端口号 21 23 25 53 69 80 161
  • 客户端使用的端口号:数值为49152~65535.这类端口仅在客户进程运行时才动态选择,所以又叫短暂端口,又称临时端口
  • 套接字 = (主机IP地址,端口号)
  • 使用TCP的典型协议有FTP、HTTP、TELNET等;使用UDP的协议主要有TFTP(小文件传输协议)、DNS、实时协议(RTP)
  • UDP在IP之上仅提供两个附加服务:复用和分用以及差错检测
  • UDP较TCP的优势:
  1. 无需创建链接,没有创建链接的时延
  2. 无链接状态。一些专用应用服务器使用UDP时,能够支持更多的活动客户机
  3. 分组首部开销小。TCP首部20字节,UDP首部仅8字节
  4. 应用层能更好地控制要发送的数据和发送时间。UDP没有拥塞控制,所以网络中的拥塞也不会影响主机的发送效率。对于某些实时性应用,容许一些数据的丢失,可是不容许有较大的时延
  • UDP提供尽最大努力的交付,全部传输可靠性的工做须要用户在应用层来完成
  • UDP是面向报文的。发送方UDP对应用层交下来的报文,在添加首部后就向下交付给IP层,既不合并,也不拆分。报文不可分割,是UDP数据报处理的最小单位
  • UDP数据报格式:

  • 校验和:检测UDP数据报在传输中是否有错。有错就丢弃。该字段是可选的,当源主机不想计算校验和,则直接令该字段为全0
  • 在计算校验和时,要在UDP数据报以前增长12个字节的伪首部。伪首部既不向下传送也不向上递交,仅仅只是为了计算校验和。既检查UDP数据报,也对IP数据报的源IP地址和目的IP地址进行了校验。
  • UDP数据报加上伪首部后:

  • 计算UDP检验和例子:

  • 对于计算UDP校验和注意:是使用16位二进制码直接进行二进制加法,有进位则加到下一位;若最高位有进位则加到最后一位,循环,直到无进位产生最后取反。好比:111 + 111 = 111。首先,1 + 1 = 0(进位1),而后 1 + 1 + 1(进位) = 1 (再进位1),再1 + 1 + 1(进位) = 1(再进位1,此时进位1加到最后一位),最后一位获得最高位的进位,变为1,不产生进位。所以最后结果为111
  • 每一条TCP只能是点对点的,TCP提供全双工通讯,TCP容许通讯双方的应用进程在任什么时候候都能发送数据,为此TCP链接的两端都设有发送缓存和接收缓存
  • TCP是面向字节流的
  • TCP传送的数据单元称为报文段
  • TCP首部长度最短20字节。TCP报文段首部格式以下:

  • TCP报文首部一些字段的意义:
  1. 序号字段。占4字节,TCP链接中传送的数据流中的每个字节都编上一个序号,序号字段的值则指的是本报文段所发送的数据的第一个字节的序号
  2. 确认号字段。占4字节,是指望收到对方的下一个报文段的数据的第一个字节的序号。与数据链路层的ACK不一样
  3. 数据偏移。占4位,即首部长度,单位是4字节。与IP数据报分片的数据偏移不一样
  4. 紧急位URG。当URG=1时,代表紧急指针字段有效。数据从第一个字节到紧急指针所指字节就是紧急数据
  5. 确认位ACK。只有当ACK=1时确认号字段才有效,当ACK=0时,确认号无效。TCP规定,在链接创建后,全部传送的报文段都必须把ACK置为1
  6. 推送位PSH。接收TCP收到PSH=1的报文段,就尽快地交付接收应用进程,而再也不等到整个缓存都填满了后再向上交付
  7. 复位位RST。当RST=1时,代表TCP链接中出现严重差错(如因为主机崩溃或其余缘由),必须释放链接,而后再从新创建链接
  8. 同部位SYN。同步SYN=1表示这是一个链接请求或链接接收报文。当SYN=1,ACK=0时,代表这是一个链接请求报文;当SYN=1,ACK=1时,表示这是一个链接接收报文
  9. 终止位FIN。FIN=1表示此报文段的发送方的数据已发送完毕,并要求释放链接
  10. 窗口字段。占2字节,指出了如今运行对方发送的数据量,可动态变化。与数据链路层的窗口仍是有很大不一样的
  11. 检验和。占2字节,检验范围包括首部和数据。检验方法同UDP检验和,只需把伪首部的第四个协议字段改成6便可。UDP协议字段是17
  12. 紧急指针字段。占16位,指出本报文段中紧急数据共有多少个字节
  • TCP链接的创建采用客户/服务器方式(C/S)。主动发起链接创建的应用进程叫作客户机,被动等待链接创建的应用进程叫作服务器
  • TCP链接的端点不是IP地址,不是应用进程,不是协议端口,而是套接字,即IP+端口
  • TCP链接创建“三次握手”机制:
  1. 客户机的TCP首先向服务器的TCP发送一个链接请求报文段。这个报文段中不含应用层数据,其首部中的SYN标志位被置为1.另外,客户机会随机选择一个起始序号seq=x(链接请求报文不携带数据,但要消耗掉一个序号
  2. 服务器的TCP收到链接请求报文段后,如赞成创建链接,就向客户机发回确认,并为该TCP链接分配TCP缓存和变量。在确认报文段中,SYN和ACK都被置为1,确认号字段的值为x+1,而且服务器随机产生起始序号y(确认报文不携带数据,但也要消耗一个序号)。确认报文段一样不包含应用层数据
  3. 当客户机收到确认报文段后,还要向服务器给出确认,而且也要给该链接分配缓存和变量。这个报文段的ACK标志位被置为1,序号字段为x+1,确认号字段为ack为y+1。该报文段能够携带数据,若是不携带数据则不消耗序号
  • 服务端的资源是在完成第二次握手时分配的,而客户端的资源是在第三次握手时分配的,这就使得服务器易于收到SYN洪泛攻击
  • TCP链接释放“四次挥手”机制:(参与TCP链接的两个进程中的任何一个都能终止该链接,下面以客户机发起释放请求为例)
  1. 客户机打算关闭链接,就向其TCP发送一个链接释放报文段,并中止再发送数据,主动关闭TCP链接,该报文段的FIN标志被置为1,seq=u,它等于前面已传送过的数据的最后一个字节的序号加1(FIN报文段即便不携带数据,也要消耗一个序号)
  2. 服务器收到链接释放报文段后即发出确认,确认号是ack=u+1,而这个报文段本身的序号是v,等于它前面已传送过的数据的最后一个字节的序号加1.此时,从客户机到服务器的这个方向的链接就释放了,TCP链接处于半关闭状态。但服务器若发送数据,客户机仍要接收,即从服务器到客户机这个方向的链接并未关闭
  3. 若服务器已经没有要向客户机发送的数据,就通知TCP释放链接,此时其发出FIN=1的链接释放报文段
  4. 客户机收到链接释放报文段后,必须发出确认。在确认报文段中,ACK字段被置为1,确认号ack=w+1,序号seq=u+1.此时TCP链接尚未释放掉,必须通过时间等待计时器设置的时间2MSL后,TCP才进入链接关闭状态
  • TCP链接创建的总结:
  1. SYN=1,seq=x
  2. SYN=1,ACK=1,seq=y,ack=x+1
  3. ACK=1,seq=x+1,ack=y+1
  • TCP链接释放的总结:
  1. FIN=1,seq=u
  2. ACK=1,seq=v,ack=u+1
  3. FIN=1,ACK=1,seq=w(随机产生一个序号),ack=u+1
  4. ACK=1,seq=u+1,ack=w+1
  • TCP提供的可靠数据传输服务就是要保证接收方进程从缓存区读出的字节流与发送方发出的字节流是彻底同样的,TCP使用了校验、序号、确认和重传机制来达到这个目的
  • 每个字节都有序号,而在一个报文段中,序号字段的值是该报文段中第一个字节的序号
  • TCP使用累计确认,只保证确认号以前的数据所有被接收(若是有乱序的数据到达,则接收方会根据其窗口大小判断是否应该接收这些乱序到达的数据)
  • 超时重传:TCP每发送一个报文段,就对这个报文段设置一次计时器
  • 冗余ACK(冗余确认)重传:TCP规定每当比指望序号大的失序报文段到达时,就发送一个冗余ACK,指明下一个期待字节的序号;同时,TCP规定当发送方收到对同一个报文段的3个冗余ACK时,就能够认为跟在这个被确认报文段以后的报文段已经丢失。这种技术一般称为快速重传
  • 发送窗口的单位为字节
  • 传输层流量控制与数据链路层流量控制的区别:
  1. 传输层定义了端到端用户之间的流量控制,数据链路层定义了两个中间的相邻节点的流量控制
  2. 传输层的窗口大小能够动态变化,而数据链路层不能够
  • 发送方的发送窗口的大小=MIN{rwnd,cwnd}
  • 拥塞控制:防止过多的数据注入网络,这样可使网络中的路由器或链路不致过载
  • 拥塞控制和流量控制的区别:拥塞控制是让网络可以承受现有的网络负荷,它是一个全局性的过程,涉及全部的主机、全部的路由器,以及与下降网络传输性能有关的全部因素。相反,流量控制每每是指点对点的通讯量的控制,即接收端控制发送端,它所要作的是抑制发送端发送数据的速率,以便使接收端来得及接收
  • 拥塞窗口:发送方根据本身估算的网络拥塞程度而设置的窗口值,反映了网络的当前容量
  • 慢开始算法:在TCP刚刚链接好,开始发送TCP报文段时,先令拥塞窗口cwnd=1,即一个最大报文段长度MSS。而在每收到一个对新的报文段的确认后,将cwnd加1,即增大一个MSS(因此通过一个RTT后,cwnd应该是变为原来的2倍)。当把拥塞窗口增大到一个规定的慢开始门限ssthresh(阈值),而后改用拥塞避免算法
  • 拥塞避免算法:发送端的拥塞窗口cwnd每通过一个RRT就增长一个MSS的大小,而不是加倍(通过一个RRT和收到对一个报文段的确认是彻底不一样的)。当出现一次超时时,则令慢开始门限ssthresh等于当前cwnd的一半(乘法减少)
  • 当网络出现拥塞时,不管在慢开始阶段仍是在拥塞避免阶段,只要发送方检测到超时事件的发生(没有按时收到确认,重传计时器超时),就要把慢开始门限ssthresh设置为出现拥塞时的发送方cwnd的一半(但不能小于2),而后把拥塞窗口的cwnd从新设置为1,执行慢开始算法
  • 慢开始和拥塞避免算法的实现举例(图):

  • cwnd不能越过ssthresh值
  • 快重传:利用冗余ACK技术用于网络拥塞的检测,快重传并不是是取消重传计时器,而是在某些状况下可更早地重传丢失的报文段
  • 快恢复:当发送端收到连续的三个冗余ACK时,即把慢开始门限ssthresh设置为出现拥塞时(当前)发送方cwnd(也是发送方的发送窗口大小)的一半,把cwnd设置为慢开始门限ssthresh改变后的数值,而后执行拥塞避免算法
  • 快重传和快恢复算法的实现举例(图):

  • 实际中,慢开始、拥塞避免算法、快重传和快恢复几种算法应该是同时应用在拥塞控制机制中的,当发送方检测到超时的时候就采用慢开始和拥塞避免,当发送方接收到冗余ACK时就采用快重传和快恢复