电信网络
---电路交换网络
---------FDM
---------TDM
---分组交换网络
---------虚电路网络,一定面向连接
---------数据报网络,两者都有,TCP,UDP
有连接的服务,TCP
可靠,顺序,字节流传输,丢失确认和重传,流量控制,拥塞控制。
HTTP,FTP,SMTP使用的是TCP
无连接的服务,UDP
不可靠数据传输,无流量控制,无拥塞控制,数据报协议
DNS,网络视频,电话等,SNMP,网络管理协议
分组交换的四种延迟
结点处理延迟,检查错误位,选择输出链路,高速路由器处理延迟-微秒级
排队延迟,等待被发送到输出链路上的时间,取决于路由器的拥塞程度
传输延迟,R=链路带宽 (bps),L=分组长度 (bits),发送分组比特流的时间 = L/R
传播延迟,d = 物理链路的长度,s = 介质的信号传播速度 (~2x108 m/sec),传播延迟 = d/s
网络分层,5层,应用,传输,网络,链路,物理
7层,应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
7层中的表示层,表示数据格式转换,比如加密,会话层,通信机制,验证服务。
应用层
HTTP,SMTP,一个拉协议,一个推协议
DNS,分层
根DNS服务器
第二层,COM,EDU,ORG服务器
第三层,amazon.com DNS服务器,pbs.org DNS服务器
本地DNS服务器
两种查询方式,递归查询和迭代查询
其实我有一点是觉得非常奇怪的,目前说是有这两种查询方式,但是纵观网上各种说法,尤其是下面这个网站
http://blog.csdn.net/lycb_gz/article/details/11720247
根本就没区分迭代还是递归好嘛,都是迭代的好嘛,只是发起迭代的对象不同而已,完全和我课本里面讲的不一样。维基百科上面也是以迭代的方式开展的。
http://blog.csdn.net/crazw/article/details/8986504
这个讲的很详细,其实现实中用的都是代理DNS进行迭代询问的,根本没有递归这一说,我没在其他地方见到过上图的递归方式,难道当时老师骗我们的?
http://zh.wikipedia.org/wiki/%E5%9F%9F%E5%90%8D%E7%B3%BB%E7%BB%9F
这是维基百科的说明,也是迭代方式进行的。所以我想,各个网站大可不必一定要区分递归和迭代,而强为之。递归应该只是一种理论方式而已,这种方式没有实现,因为,根服务器怎么可能帮你去递归查询功能嘛。
TCP编程和UDP编程,JAVA版本,C++版本,JAVA的IO,TODO
传输层
多路复用,从多个套接字收集数据, 用首部封装数据,然后将报文段传递到网络层(多路复用)
多路分解,将接收到的数据段传递到正确的套接字(多路分解)
UDP,校验和,
UDP检验和的计算方法是:
1.按每16位求和得出一个32位的数;
2.如果这个32位的数,高16位不为0,则高16位加低16位再得到一个32位的数;
3.重复第2步直到高16位为0,将低16位取反,得到校验和。
UDP头,8个字节
可靠传输
增加ACK和NAK的机制(第二代),规定时间内没收到ACK则重发(第三代)。
下一代的技术,流水线技术,允许发送多个包,进行多个确认。go back n
选择重传。
TCP技术
字节流,意味着TCP不像UDP那样有信息边界,流水线,提供了拥塞控制,设置窗口大小。全双工,TCP是双向连接的,双通道的,一方通道不通,另外一方可以继续传输局。面向连接,流量控制。TCP报头,20字节
可靠数据传输,
流量控制,拥塞控制
乘性递减(发生丢失事件后将拥塞窗口减半),加性递增(每个RTT内如果没有丢失事件发生,拥塞窗口增加一个MSS : 检测);慢启动(当连接开始的时候以指数方式增加速率,直到第一个丢失事件发生:倍增 CongWin在每个 RTT内,每收到ACK完成增加CongWin。总结: 初始速率慢但是呈指数快速增长);对超时时间反应
对拥塞事件的反映
三个重复的确认后:
CongWin 减半
然后,窗口线性增长
但超时事件后,TCP进入慢启动过程:
CongWin 立即设置为 1个 MSS;
窗口开始指数增长
到一个阀值后(这个阈值是之前最大值的二分之一)再线性增长
主要原因是,收到3哥重复的确认,说明网络还是具有一定的能力进行传输,但是如果是超时,那就直接慢启动,从头开始。
网络层
虚电路和数据报网络
最长前缀匹配,因为路由表中的每个表项都指定了一个网络,所以一个目的地址可能与多个表项匹配。最明确的一个表项——即子网掩码最长的一个——就叫做最长前缀匹配。之所以这样称呼它,是因为这个表项也是路由表中,与目的地址的高位匹配得最多的表项。
路由器工作原理
运行路由算法/协议 (RIP, OSPF, BGP)
将分组从输入链路转发到适当的输出链路
NAT网络地址转换
解决地址紧张问题,但是存在一系列的问题
ICMP,因特网控制报文协议。建立在IP上的
选路算法,Dijkstra算法,距离向量算法
两个点集合,一个是最小距离集合,一个是未知集合。每次从未知集合中选择一个距离最小集合最小的点
距离向量算法,是通过接收从邻居传过来的信息进行计算,动态进行刷新。
层次选路,不同于上面两个方法,真实环境不可能路由器存储所有结点,所以层次选路,每个网络管理者管理自己的区域。
自治域内的选路算法,RIP, OSPF, BGP
序列化和反序列化
序列化:序列化是将对象状态转换为可保持或传输的形式的过程,反序列化是相反的。其实这里是指的,将对象转换为网络或存储的格式,比如字符流之类的。明白了python里面的一个类cpickle,load和dump就是做这个事情的。
链路层和局域网
链路层服务:把网络层数据报加头和尾,封装成帧,帧头中包括指明目的和源的“物理地址”(不同于IP地址)。以前一直觉得网络大部分处理的时候是将包加个包头就可以了,没想到原来链路层帧是加头和尾的。
802.3帧结构 | |||||
前导 8字节 | DA 6字节 | SA 6字节 | 长度 2字节 | 数据 | FCS |
Etllernet帧结构 | |||||
前导 8字节 | DA 6字节 | SA 6字节 | 类型 2字节 | 数据 | FCS |
链路层帧的错误检测,不是纠错。CRC校验,在数据后面添加一个一个r位的校验位
在链路上进行传输数据的时候
载波侦听多路访问
冲突检测
当一个节点要发送数据时,首先监听信道,看是否有载波。
如果信道空闲,则发送数据。
如果信道忙,则继续对信道进行监听(1-持续CSMA)。一旦发现空闲,便立即发送。
如果在发送过程中检测到碰撞,则停止自己的正常发送,转而发送一短暂的干扰信号jam,强化冲突,使其它站点都能知道出现了冲突。
发送了干扰信号后,退避一随机时间,重新尝试发送。
链路层编址
ARP地址解析协议
1、A想发送分组给 B,A知道 B的IP地址
2、假设B的MAC地址不在A的ARP表中
3、A广播包含B的IP地址的ARP查询包
目的MAC地址= FF-FF-FF-FF-FF-FF
在局域网上的所有机器都能收到ARP查询
4、B收到 ARP包,回给A一个带有B的MAC地址的包
包单播unicast发送给A的MAC地址
5、A缓存IP-to-MAC地址对在 ARP表中,直到信息过期 (timeout)
软件规定: 如果ARP表的信息在一定时间内没有刷新,则信息将过期。
这也就是为什么wireshark软件会抓取到这么多的ARP的包
集线器和交换机
集线器:物理层,物理层上结点汇集会有冲突
交换机:链路层,存储转发以太帧,没有冲突,自学习,因为有交换机表