Fork me on GitHub

计算机网络第五章

计算机网络——传输层

  • 定位:传输层属于通信部分的最高层,也是用户功能中的最底层;
  • 只有主机的协议栈才有传输层与应用层,路由器在分组/转发时只用到了下三层的功能。

功能

  1. 提供应用进程之间的逻辑通信(端到端的通信,事实上并无直连)。即使网络层是不可靠的,但传输层同样可以为应用程序提供可靠地服务。
  2. 传输层用的复用和分用:
    • 复用:发送方的不同进程使用同一个传输层协议;
    • 分用:接收方的传输层在剥去报文的首部后能够把这些数据正确交付到目的应用程序。
  3. 传输层可以对收到的报文进行差错检验(首部和数据部分),而网络层只检查IP数据报的首部。
  4. 可以同时提供两种传输协议,面向了连接的TCP和无连接的UDP。网络层只提供面向连接的服务(如虚电路)与无连接服务(数据报)的其中一种(不能同时存在)。

端口

  • 主机中应用进程的标识,但只适用于本计算机中。
  • 作用:能够让应用层的各应用进程将数据通过端口向下交付,让传输层知道应当将报文段的数据向上交付给进程。
  • 端口号,长度16bit,65536个(即2^16)。分为两类,服务端使用和客户端使用的两类:
    • 服务端使用的端口号,又可分为两类,熟知端口号和登记端口号:
      • 熟知端口号:0~1023,指派给TCP/IP最重要的一些应用程序;
      • 登记端口号:1024~49151,指派给没有熟知端口号的应用程序,需要在IANA上登记,以免重复
    • 客户端使用的端口号,49152~65535,仅在客户进程运行时临时分配,通信结束,端口号就不复存在了。
  • 套接字:即socket,是主机IP地址和端口号的组合。唯一标识了网络中的一个主机和其上的某一个应用(进程)。

无连接服务和面向连接服务

  • 采用TCP时,传输层向上提供一条全双工的可靠逻辑信道,而采用UDP时,是一条不可靠的逻辑信道。
  • TCP不提供广播或组播服务,应用在FTP、HTTP、TELNET等场合。
  • UDP仅提供两个附加服务:多路复用和对数据的错误检查。应用在DNS、SNMP、RTP、TFTP等。

UDP协议

  • UDP的优点:
    • 无需建立连接。更快。
    • 无连接状态,TCP需要维护的连接状态包括接收和发送缓存、拥塞控制和序号与确认号的参数;UDP不需要跟踪这些参数,因此在某些专用服务器上,能够支持更多的活动客户机。
    • 分组首部开销小,首部仅8B,而TCP有20B。
    • 应用层能够更好的控制发送的数据和发送时间。UDP没有拥塞控制,主机可以无视网络拥塞情况进行发送。某些不允许较大时延的应用会倾向于使用UDP。
  • UDP是不可靠服务,但维护可靠性的工作必须要做,而且是由应用层来完成,应用实体可以根据应用的需求来灵活设计自己的可靠性机制。
  • [重点]UDP是面向报文的,发送方拿到应用层下放的报文,添加首部后直接下放到IP层(不合不拆);接收方反过程。特点:一次交付一个完整的报文,因此UDP的报文不可分割。

UDP数据报格式

  • UDP数据报=首部(8B)+数据(可以没有)
  • 首部=源端口号(如果不需要对方回信,写全0)+目的端口号+UDP长度(包括首部和数据)+UDP检验和(如果不需要检验,写全0),各2B
  • 场景:如果接收方发现目的端口号无法对应出进程,会丢弃该报文,并由ICMP发送“端口不可达”差错报文给对方。

UDP校验

  • 采用二进制反码运算求和再取反的办法。
  • 针对首部和数据部分。
  • UDP校验需要将IP伪首部、UDP首部、UDP数据分为16位的字(若干个16bit,如果总长度为奇数个字节,则在最后添加一个全为0的字节),然后进行二进制反码求和校验。
  • 二进制反码求和:从低位到高位逐列进行求和(正常进位,如果最高位有进位,则最终结果加1),最终的结果取反码,就可以写入校验和字段中了。先相加后取反和先取反后相加,结果一样
  • IP伪首部=源IP地址(4B)+目的IP地址(4B)+ 协议号(2B)+UDP长度(2B)。
  • [理解]伪首部是从数据报所在IP分组头中提取的,仅仅用来计算校验和。

TCP协议

  • 特点:
    • 面向连接;
    • 只能一对一;
    • 提供可靠地交付服务,保证数据无差错、不丢失、不重复且有序;
    • 提供全双工通信,允许双方在任何时候发送数据,为此TCP连接的两端都设有发送缓存和接收缓存。
    • 发送缓存用来暂时存放的数据有:
      • 准备发送的数据;
      • 已发送但未收到确认的数据;
    • 接受缓存用来暂存的数据有:
      • 按序到达,但未被接收应用程序读取的数据;
      • 不按序达到的数据;
    • 面向字节流,TCP把应用程序交下来的数据看成仅仅是一连串的无结构的字节流。(对比报文流,报文流有边界)

TCP首部

  • TCP报文段=TCP首部+数据

TCP

  • TCP首部=
    • 源端口(2B)
    • 目的端口(2B)
    • 序号(4B,标识在这个报文段中的第一个数据字节)
    • 确认号(4B,上次成功收到的数据字节序号+1,即期望对方发送的字节序号)
    • 数据偏移(首部长度,4bit,用来定位到本报的数据区)
    • 保留字段(6bit,暂无用途,设全0)
    • 紧急位URG(URG=1时紧急指针有效)
    • 确认位ACK(ACK=1时确认序号才有效,交互时ACK一般都是1)
    • 推送位PSH(强制刷出缓存,交付到上层)
    • 复位位RST(重大故障,释放连接后重建连接)
    • 同步位SYN(SYN=1时,说明这是一个连接请求或连接接收报文)
    • 终止位FIN(FIN=1时,要求释放传输连接)
    • 窗口字段(2B)(指明允许对方发送的数据量,高速对方发送量不能超过本方缓存空间)
    • 检验和(2B)(与UDP的类似,只是协议号从17改成6)
    • 紧急指针字段(16bit)(指明本报文中紧急数据共有多少字节,其中紧急数据在数据区的最前端)
    • 选项字段(可变长,含MSS(最大报文段长度,即数据字段的最大长度,默认536B))
    • 填充字段(把整个首部长度凑成4字节的整数倍)

TCP连接管理

  • TCP连接三阶段:连接建立、数据传送、连接释放。
  • 解决问题:
    • 每一方都能确知对方存在;
    • 双方协商一些参数,如最大窗口值,是否使用窗口扩大协议,时间戳选项,服务质量等;
    • 对运输实体资源进行分配(如缓存大小、连接表中的项目)
  • 采用客户/服务器方式,主动发起建立连接的进程叫做客户机。

三次握手和四次挥手

1
2
3
4
5
6
7
8
9
10
11
12
//三次握手
client:SYN=1,seq=x; //我是x,请求连接

server:SYN=1,ACK=1,seq=y,ack=x+1; //收到,我是y,请让x+1过来
//(server内心os:client的发送功能完好,自己接收功能完好)
//此时server会为该TCP链接分配TCP缓存和变量

client:ACK=1,seq=x+1,ack=y+1;//收到,我是x+1,请让y+1过来
//(client内心os:client的发送接收功能完好,server发送接收功能完好,这事要告诉server)
//此时x+1已经可以携带部分数据了
//此时client会为该TCP链接分配TCP缓存和变量
//以上几次交互会消耗掉序号(即x/y之类)
  • 服务器端的资源是在第二次握手时分配的,使得它容易受到SYN洪泛攻击。
1
2
3
4
5
6
7
8
9
10
11
//四次挥手
client:FIN=1,seq=u;// 我是u,给server的数据传完了,我打算关连接了;

server:ACK=1,seq=v,ack=u+1;// 收到,我是v,请让u+1过来
//此时client到server不再有数据传输,TCP处于半关闭状态

server:FIN=1,ACK=1,seq=w,ack=u+1;// 收到,我是w,给client的数据传完了,我打算关连接了,请让u+1过来

client:ACK=1,seq=u+1,ack=w+1;// 收到,我是u+1,下次让w+1过来
//此时TCP连接尚未释放掉,需要等待计时器2MSL后,连接才关闭

  • 等待2MSL的原因:保证client发送的最后一个确认报文段能够达到server,如果不等,若此报文丢失,那么server将无法正常关闭,而且因为client的提前关闭,将无法重传。

TCP可靠连接的保证

  • 采用了校验、序号、确认、重传等机制。
    • 校验:方法同UDP,此处不赘述
    • 序号:使用报文段的序号字段,标识字节流的顺序。
    • 确认:使用报文段的确认字段,并使用累计确认的机制(举例:确认号12,意思是0~11我都确认没有问题,12有问题)。累计确认有后退重传N帧(GBN)的风格,但是,收到正确却失序的报文不会被丢弃,而是缓存起来,GBN会要求重传失序后的所有帧。
    • 重传,出现超时和冗余ACK时会进行重传。
      • 超时,每发送一个报文段,会对该报文段设置计时器,如果计时器设置的重传时间到期但还没有收到确认,就要重传这一报文段。注:重传时间RTO采用自适应算法,参考往返时间RTT来进行校核(重传时间略大于RTT)。新RTT=(1-a)×旧RTT+a×新RTT样本,a初始设为0.125;RTO=RTT+4×RTTD,RTTD为RTT的偏差的加权平均值。
      • 冗余ACK,比如发送方A发了1,2,3,4,5的TCP报文段,2丢了;因此3,4,5对于接收方B而言就是失序报文段,不是B所期望的下一个字节序号,此时B会发送一个2的冗余ACK(B收到3,4,5,均发送一个2的冗余ACK,TCP规定的:非期望,发冗余ACK);之后A收到3个关于2的冗余ACK,会立即重传2号报文段(TCP规定3次相同的冗余ACK会立即触发重传,不用等待超时),即快速重传。

TCP流量控制

  • 类似数据链路层的滑动窗口控制,区别在于是端到端的,而且窗口大小可以协调改变(数据链路层的窗口大小不能动态改变)
  • 目的:消除发送方使接收方缓存区溢出的可能性。
  • rwnd和cwnd:
    • 接收方在向发送方传递的消息首部中,设置窗口字段值,限制发送窗口的大小,这里的值称为“接收窗口rwnd”。
    • 发送方根据自己对当前网络拥塞程序的估计而确定的窗口值,称为“拥塞窗口cwnd”
    • 发送方的发送窗口的实际大小是rwnd和cwnd中的较小者。但一般情况下,接收方总是有足够大的缓存空间,所以主要看cwnd,即网络拥塞程度。

TCP拥塞控制之慢开始&拥塞避免

  • 推荐阅读:TCP拥塞控制-慢启动、拥塞避免、快重传、快启动
  • 流程略,参考上文博客,下面谈谈理解:
    • 设定一个ssthresh作为慢开始转拥塞避免的转折点;
    • 令cwnd=1,然后逐步翻倍,大于或等于cwnd时,转换成拥塞避免方式(此方式下cwnd加一递增,慢);
    • 若出现超时现象,ssthresh变为当前cwnd的一半,而cwnd从1开始慢启动方式;
    • 注意:若在翻倍过程中cwnd超过ssthresh,那么cwnd取ssthresh值。

TCP拥塞控制之快重传&快恢复

  • 使用冗余ACK来进行网络拥塞的检测。在超时机制的基础上引入冗余ACK,能够更早响应报文丢失的情况。
  • 当发送端连续收到三个冗余ACK时,就执行ssthresh腰斩的过程,此时cwnd也会相应的变成与新的ssthresh一致的值(在慢开始中,ssthresh要找后,cwnd会从1开始),因此叫做快恢复。
-------------The End-------------