4.1 路由、路由表与静态路由
1. 路由:分组在因特网上从一台计算机传输到另一台计算机的实际路径。
2. 路由表:因特网上为每个路由器都存储了一张表,称为路由表
3. 路由表通常包含以下五个属性
✓ 目标网络的IP地址:一个32位数
✓ 目标网络的子网掩码:一个32位数
✓ 下一站IP地址:一个32位数
✓ 发送接口名字:一个设备名字。在路由器上,每个网络接口都是一个有唯一名称的设备,发送接口指示IP分组的下一站IP地址,应该从本机的哪一个接口发送出去。注意接口名字只是对本路由有意义,没有任何全局含义。
✓ 本路由器到达目标网络的路由度量:这个属性反映该路由的优劣,属性值随路由协议不同而不同。
要求掌握根据路由表画出IP网络的布局 和根据网络IP的分配写出某个路由器的路由表:
1.目标IP:要到达的目标网络,根据目标IP与子网掩码相与(& :与 a&1=a,a&0=0)
2.子网掩码:如:202.202.0.0/16,其中16表示子网掩码的位数,即255.255.0.0
3.下一站IP地址:直接相连为C,不直接相连为下一个路由器与此网段相连的接口的IP
4.发送接口:此路由器发送的端口的名字
5.距离:直接相连为0,否则经过的路由器的个数即为到达该网段的距离。
6.默认路由项:当知道此网段与其他网络相接处RX的IP才可计算,默认路由项的目标网络地址为:0.0.0.0;子网掩码:0.0.0.0 下一站IP,发送接口:与到达RX项的下一站IP同,距离:未知。
R1的路由表:
R2的路由表:
R3的路由表
4.2 路由器与IP分组转发算法
4.3 动态路由的基本概念
1.动态路由表 依靠各个路由器上运行的特殊进程在路由器-路由器之间不断的交换路由信息来推断,学习出网络的全局路由。
2.
7.1 传输层概述
7.1.1 端口的概述
传输层将IP分组中的信息提交给目的主机的进程。传输层引入端口的概念,通过端口来标识一个主机上的进程,在传输层协议的PDU格式当中,都有目的端口这样一个域,传输层会根据这个域的不同值把PDU提交给上层的不同进程。
7.1.2 UDP和TCP
UDP:无连接的,在通信开始或结束时不需要维护与连接有关的一些参数。UDP不保证数据的可靠传输,UDP仅将数据传输一次,如果在传输过程中出错或丢失,UDP不会重传,而TCP采用了检错和应答机制,如果发送方收不到来自接收方的应答,则发送方会进行重传。
UDP使用于对实时性要求很高但却允许一代错误的应用,UDP可以进行组播。TCP则适用于需要保证可靠性的应用。
7.2 UDP
7.2.1 UDP概述
UDP在IP层之上所增加的功能仅仅是把IP层所提供的主机到主机之间通信延伸为进程到进程的通信。
7.2.2 UDP报文格式
✓ 源端口号:目的主机的UDP端口号,占两个字节,取值范围:0~65535
✓ 报文长度:整个UDP报文长度,占2个字节,取值范围:8~65535;至少8字节,UDP首部占8字节
✓ UDP伪首部:源IP地址(32b),目的IP地址(32b),UDP协议号(为17)(8b)以及UDP报文长度(16b),其中前三个信息从IP中获得。伪首部是为了计算校验和而被考虑的一段信息,不存在UDP报文中。
✓ 校验和:2字节,利用Internet Checksum算法得到,该算法输入整个UDP报文和伪首部,具体如下:
✧ 将输入划分为一系列长度为16b(b :比特,B:字节)的正数。
✧ 按反码表示法的加法规则及时这些整数的和。
✧ 将按位取反,即得长度为16b的校验码
7.2.3 多路复用与分解
✓ 多路复用:不同进程将数据静传输层交付给网络层来传输的过程。
✓ 多路分解:由网络层经传输层向上层不同进程提交数据的过程。
7.2.4 UDP应用
✓ 多媒体通信:对实时性要求很高,但允许出现一定的差错。有时为了避免网络传输所造成不均匀延时,在声音。图像的每个分组都加一个时间戳。后来形成了一个协议来提供时间戳,这个协议就是RTP协议。
✓ IP组播:IP层提供了组播功能,该功能使用的目的IP地址是D类IP地址,其范围是224.0.0.0~239.255.255.255。只有UDP能完成IP组播,因为UDP是无连接的传输层通信方式,而TCP是面向连接的传输层协议,只能够提供一对一的服务。
✓ 具有重复行为的协议:要求协议的行为有较低的开销,而且不需要严格的保障协议的可靠性。
7.3 可靠协议的一般实现方法
实现可靠协议的一种最常用的解决方案是APQ机制。
✓ 停等协议:发送一个数据分组后就等待一个等待应答分组,收到应答分组后,才会发送下一个数据分组。
✓ 滑动窗口协议:无需等待应答就可以发送下一个数据分组,用滑动窗口来限制允许发送的、但不需要等待应答的时间分组的数量。下面介绍两个滑动窗口协议:
✧ 回退N:接收方只按顺序解释数据分组,即接收方会抛弃出错分组后面所有的分组(尽管这些分组可能正确到达)。当某个分组发生错误时,要重传该分组后面的所有分组。此处接收窗口为1。
✧ 选择重传:让接收方接收并且应答每一个正确收到的分组,这样发送方只需超时重传没有收到应答的分组就可以了。此协议要求接收窗口大于1。
7.4 TCP协议
7.4.1 TCP概述:TCP协议具有面向连接、可靠以及提供流量控制和拥塞控制等特性。
7.4.2 TCP段格式
✓ 源/目的端口号:源或目的IP端口号,各占用2个字节。
✓ 序列号:接收方所传输的TCP负载中的第一个字节的序列号,占用4字节,在TCP传输超过4G后序列号被重复使用。
✓ 应答号:接收方期待收到的下一个字节的序列号。占用4字节。
✓ 首部长度:段首部长度,占用4比特。可表示的最大数位15(1111),每个代表4字节。所以TCP首部最大可为4*15=60字节。
✓ 标志比特:
✧ URG:为‘1’数模该段中含有紧急数据
✧ ACK:为‘1’时说明应答号有效,除申请建立连接之外,每次都为‘1’。
✧ PSH:为‘1’时,要求接收方TCP实体将该段中的负载立即提交给应用层。
✧ RST:为‘1’时,发送方要求重置连接。
✧ SYN:在TCP建立连接时使用,为‘1’时,表示要求建立连接,后均为‘0’。
✧ FIN:在TCP连接关闭的时候使用,为‘1’时,说明发送方要求单方面断开连接,即发送数据完成。
✓ 窗口大小:发送方搜剩余的介绍缓冲区的大小。
✓ 校验和:与UDP类似。
✓
建立连接:(三次握手)
数据传输:
关闭连接:
看一道题:
一个TCP连接由哪几个属性完全标识?
答: 源IP地址、源IP端口号、目标IP地址、目标IP端口号
TCP客户端当前已被确认的最高序列号是20000, 服务器端当前已被确认的最高序列号是3000, 画出关闭从服务器到客户端方向的TCP连接的过程, 并在图上标出正确的序列号和确认号。
答:
客户端 服务器
FIN,起始序列号=3001
ACK, 确认号=3002
(错一个标记减1分,关闭的方向错误减2分)
(3)按从低到高的顺序指出OSI七层参考模型包含哪七层。
答:物理层、数据链路层、网络层、传输层、会话层(或会晤层)、表示层、应用层
(4) 就以上七层中的任意五层, 分别举出一个实际协议的例子。
答:物理层:任何一种调制解调体制
数据链路层:ALOHA、CSMA或CSMA/CD、TDMA、FDMA、CDMA、FDDI等之一
网络层:ARP、IP、ICMP、RIP、OSPF、BGP等之一
传输层:TCP、UDP之一
会话层:NetBIOS等
表示层:XML、HTML、MIME、XDR等之一
应用层:FTP、HTTP、DNS、ODBC、RPC等之一
(每个正确的例子1分)
填空题(每空2.5分,共15分)以下是一个TCP传输过程, 假设每次接收方都全部接受到达的数据, 请正确填写图中括号中的数字。
A B
200字节数据, 序列号=10240
ACK, 确认号= ( 10440 )
500字节数据, 序列号= ( 10440 )
ACK, 确认号= ( 10940 )
4450字节数据, 序列号=90000
ACK, 确认号= ( 94450 )
400字节数据, 序列号= ( 94450 )
ACK, 确认序列号= ( 94850 )
针对传输服务抽象出了一个普遍适用的,统一的抽象模型是基于socket的,端-端的字节流。
socket API 函数:
✓ int bind(int sock , struct sockaddr* localaddr, int addrlen)
为socket对象指定地址即传输层端口号,这个函数对服务器程序最有用。
✓ int connect(int sock , struct sockaddr* remoteaddr, int addrlen)
建立描述sock所标识的本地socket对象到remoteaddr所指示的远程对象之间的连接。主要被用户进程调用。
✓ int listen(int sock , int queuelen)
listen使TCP-socket对象sock准备接收到达的连接请求。
✓ int accept(int sock , struct sockaddr* remoteaddr, int* paddrlen)
等待完整的连接建立起来,这是任何一个基于TCP的服务器进程都必须调用的,调用accept的函数的进程或线程进入睡眠,直到有TCP连接请求到达并且正确建立连接后函数才被唤起,此时TCP的三次握手已完成,把新建立起来的连接返回,把原来的socket复制。
✓ int read(int sock, char* buff, int size)
✓ int write(int sock, char* buff, int size)
这两个函数是阻塞式的,即他们使用进程或线程知道其操作完成后返回。在UDP和TCP上都可以调用这两个函数,但是UDP-socket对象上操作系统在发送后便使write正常返回,否则write返回错误,只有当TCP字节总数超过该临界水平read函数才返回,否则一直阻塞。
✓ int close(int sock)
在调用该函数后,socket对象不再可用,即不能再在socket对象上调用read/write函数,否则返回错误。
✓ int shutdown(int sock , int flags)
这是个比close更灵活的函数,它关闭本地的socket对象到对方socket对象的TCP连接,此时write函数不可用,但read函数可以调用。
✓ int setsockopt(int sock, int leve, int iption, char* optlen)
设置大量的socket对象设置选项。
¥29.8
¥9.9
¥59.8