一、计算机网络概述
1、因特网概述
- 网络、互联网和因特网
<1>网络:由若干节点和连接这些节点的链路组成
<2>互联网(internet):多个网络通过路由器相连组成了互联网
<3>因特网(Internet):最大的互联网 - 因特网的结构:
<1>三层结构:ISP是因特网服务提供者
<2>核心部分:网络和连接网络的路由器组成,位用户提供服务。边缘部分:用户直接使用的主机组成。
- 三种交换方式:
<1>电路交换:
三个步骤:建立连接,通话,释放连接
特点:建立连接后独自连接线路,其他用户不可使用,直到释放连接。
优点:通信时延小,实时性强
缺点:独占线路,效率低
<2>分组交换:将报文分割为一个一个的分组,每个分组都由路由器转发,每个报文的选择的线路都有可能不同。
优点:无需建立连接,提高线路利用率
缺点:有转发时延,需要额外存储空间
<3>报文交换:与分组交换类似,但报文交换直接将整个报文进行传输而不对报文进行分割。 - 计算机网络分类:根据拓扑结构可以分为
<1>总线型:
<2>星型:
<3>环型:
<4>网状:
- 计算机网络体系结构:下面讨论的都是五层结构
<1>各层的作用:
物理层:解决了采用什么接口作为网络接口;如何表示0、1;使用什么传输介质
数据链路层:如何标志网络中的各个主机(主机编址,如MAC地址);如何从一串比特流中区分出地址和数据;如何协调各主机争用主线
网络层:如何标志各个网络以及网络中的各个主机(网络和主机共同编址问题,如IP地址);路由如何分组转发,路由选择问题
运输层:如何解决进程间通信问题;传输出错如何处理
应用层:通过应用进程间的交换来完成特定的网络应用。
- 专用术语:
<1>实体、对等实体
实体:任何接收或者发生消息的硬件或者进程
对等实体:收发双方相同层次的实体
<2>协议:控制两个对等实体进行通信的规则集合。
协议三要素:
语法:定义所要交换的信息的格式
语义:定义收发双方需要进行的操作
同步:定义收发双方的时序关系
不同层次之间协议的关系:
<3>服务:下一层需要为上一层提供服务。
PDU:对等层次之间传输的数据包
SDU:同一体统内,层与层之间参数的数据包
二、数据链路层(只负责在一个网络内传输数据,不能实现跨网络数据的传输)
1、数据链层的三个问题(点对点信道的数据链路层需要解决问题)
-
分装成帧:在一段数据的前后添加首部和尾部。
<1>如何区别出一个一个的帧:PPP格式的帧第一字节和最后一个字节用来做帧定界。而MAC帧需要在帧的前面加上前导码,并且每个正直接有时间间隔。
<2>透明传输:如果上层传来的数据中有前导码或者帧定界符怎么办?
1.面向字节的物理链路(传输单位时字节):采用字节填充,在上层数据中的前导码或者帧定界符前面加一个转译字符ESC,如果在上层数据中有转译字符则再添加一个转义字符。
2.面向比特的物理链路(传输单位为比特):再在上层数据中的前导码或者帧定界符前面加一个0。
-
差错检测:检测传输过程中可能出现的误码。再以太网V2的MAC帧和PPP帧首部都要FCS校验位,可以使用奇偶检验或者循环冗余校验来检测是否出现了误码。
-
可靠传输:保证发送方发送什么接收方就能接收什么。出现误码,分组(也就是帧)丢失,分组失序,分组重复仍保证传输的数据是正确的。
三种可靠协议:
<1>停止-等待协议SW:发送方发送数据后,接收方必须要接收确认消息后才能发送下一个数据。
1.确认与否认:发送方发送分组后,收到接收方的确认分组就会发送下一个分组。如果接收方检验后发现分组有误码,就会发送否认分组,要求重传分组。
2.超时重传和确认丢失:发送方发送分组后,接收方在规定的时间内没有接收到确认分组就会重传分组。有时发送方的分组只是延误到达并没有丢失,这样就会发生分组重复;或者接收方的确认分组丢失也会导致重传,进而导致分组重复,为了避免这个问题需要对发送的分组进行编号。
3.确认迟到:确认分组没有丢失而是迟到,导致发送方接收到重复确认,进而导致发送分组混乱,为了解决这个问题需要为确认分组编号。
<1>回退N帧协议GBN:停止等待协议效率过低,必须收到确认后才能发送下一个分组。GBN采用了滑动窗口,若分组编号为 0 到 2 n − 1 0到2^n-1 0到2n−1,发送窗口大小 1 < W T < 2 n − 1 1<W_T<2^n-1 1<WT<2n−1(如果等于1则退化为停止等待协议)接收窗口大小为1。
1.无差错情况:发送方可将窗口内的数据都按序发送出去,在没有发生乱序和误码的情况下接收方可以按序接收并且向右移动窗口,此外接收方还会进行累计确认,比如ACKn表示序号n前面的数据已经收到。发送方收到数据后也会向右移动窗口。
2.有差错的情况:如果发现误码接收方就会丢弃分组,或者发生了分组乱序或者分组丢失,由于接收方只有一个窗口只能接收5号分组,发送方就必须按照顺序重传5,6,7,0,1分组。这样是为什么叫做回退N帧协议(GBN)。
<3>选择重传SR:在GBN中,一旦分组发生了误码、乱序或者丢失,由于接收方只有一个窗口,发送方必须重传窗口中的所有分组,造成网络资源的浪费。为了解决这个问题,SR将接收方的接收窗口大小 W R W_R WR设置为 1 < W R ≤ W R 1<W_R\leq W_R 1<WR≤WR。在发生误码、乱序或者丢失时,先将接收到的分组放入窗口内,等之前的分组到到齐后再提交。需要注意的是,SR并没有采用累计确认的方式,而是分别对每个分组进行确认。
2、集线器、网桥与交换机(解决多态主机同时发数据的碰撞问题,隔离碰撞域)
集线再物理层扩展以太网,拥有少量的纠错能力和网络管理功能,不能隔离碰撞域也不能隔离广播域;网桥可以隔离碰撞域;交换机可以隔离碰撞域。
-
集线器:早期的总线型以太网使用同轴电缆已被淘汰。使用集线器时(HUB),主机通过双绞线连接集线器,本质上还是一个总线型网络,拥有少量的纠错能力和网络管理功能,不能隔离碰撞域也不能隔离广播域。
几个HUB连接起来后将形成更大的碰撞域。
-
以太网交换机:以太网交换机维护了一张帧交换表(也就是MAC地址和以太网接口的对应关系),对于主机发来的帧,先看源MAC地址所对应的接口,如果就是本接口不予转发,如果不是则将该帧转发给对应的接口。
<1>帧交换表自学习和帧转发:一开始帧交换表为空。对于交换机中的一个接口,当有主机发数据时,取出源MAC地址,查询表中的该接口,如果没有该接口添加MAC地址和接口的对于关系,如果有并且MAC地址与源MAC地址不同则更新MAC地址;然后取出目的MAC地址,查询表中有没该MAC地址,如果有则发送到对应的接口并由这个接口转发数据,如果表中没有目的MAC地址就进行盲目洪泛。
<2>以太网交换机生成树协议:为了提高网络的可靠性,会添加冗余链路,但这样会形成环路进而导致广播风暴。使用生存树协议来避免形成环路并且保证网络正常工作。
-
网桥:只有两个接口的交换机,一开始技术有限只有两个接口。
3、虚拟局域网(隔离广播域)
使用以太网交换机连接的交互式以太网都属于同一个广播域(一台主机发送广播帧所有的主机都可以收到),路由器可以隔离关闭域但成本太高。
<1>虚拟局域网:将一个局域网的设备划分为与物理位置无关的逻辑组。
<2>实现:首先需要交换机支持IEEE802.1Q帧,交换机支持不同端口类型:
1.IEEE802.1Q帧:在普通以太网帧的基础上添加了VALN标记字段
2.交换机端口:Access,Trunk,Hybrid(华为私有)
Access端口用来连接普通主机,每个Access端口都有一个PVID,属于同一个VLAN的PVID相同。主机向Access端口发送广播帧后,在该关播帧上打上VLAN标记(也就是PVID的值),交换机上只有PVID与VLAN标记相同的端口会转换,转发时会将VLAN标记去除。
Trunk端口:用于连接交换机,相连的Trunk端口的PVID相同。对于打过标记的广播帧,如果VLAN标记与trunk口的标记不相同,则会直接转发给相连的trunk口,相连的trunk口会直接转发给对应的Access端口;如果VLAN标记与trunk口的标记相同则会去VLAN标记然后转发给相连的truck口,相连的trunk会再打VLAN标记,这样做只是为了避免重复打标记。
4、MAC地址、IP地址与ARP协议(MAC地址属于数据链路层但IP地址与ARP协议属于网际层)
- MAC地址:MAC地址(物理地址、硬件地址):MAC地址属于物理层而不属于数据链路层,一般固化在网卡的只读存储器中(有线网卡和无线网卡各有一个MAC地址)。MAC地址用来唯一标志一台主机。
- ARP地址解析协议:
<1>数据包转发过程中IP地址和MAC地址的变化:
1.源IP地址和目的IP地址不变,源MAC地址和目的MAC地址逐个改变。由于IP地址不变,ARP协议只是根据IP地址找MAC地址。
2.IP协议工作在网际层,它负责找到一条路由路径将IP数据报从源主机发送到目的主机,实际上网际层的IP协议并不负责发送数据,它只负责为当前IP数据报所在位置(主机或路由器)找到下一跳(下一个路由),真正传输数据的是数据链路层。
3.如下,对于H1发送的IP数据报,IP协议为其找到下一个路由器是P1。数据链路层根据H1的MAC地址和P1的MAC地址将数据传输到R1。IP数据报到达R1后,IP路由协议为其找下一跳R2,数据链路层根据R1的MAC地址和R2的MAC地址进行数据传输。重复上面步骤知道找到主机H2。
4.注意数据链路层只能在一个网络内传输数据,这也是为什么两个路由相连的端口端口号要一样。
那如何根据IP地址找MAC地址呢?ARP协议
<2>ARP(地址解析协议):
B要给C发送数据,B就要知道C的MAC地址。B知道C的IP地址。
1.B先查找自己的ARP缓存表,如果没有找到C的IP地址对应的MAC地址,B会发送广播,广播中包含自己的IP地址和MAC地址。
2.C收到B的广播发现目的MAC地址是自己,记录B的IP地址和MAC地址对应关系。C发送单播给B,B发现目的地址是自己,记录C的IP地址和MAC地址的对应关系,A发现目的MAC地址不是自己直接丢弃。到此,B就可以发送消息给C了。
<3>静态ARP高速缓存表和动态ARP高速缓存表。
<4>由于ARP需要进行广播,单路由器是隔离广播域(避免广播风暴)的所以ARP只能在一个网络内使用而不能跨网络使用,这也是为什么数据链路层只能进行一个网络内数据的传输。
三、网络层
1、网络层提供的两种服务:
- 虚电路:面向连接,网络负责可靠交付
- 数据报服务:面向无连接,尽最大努力交付,不保证服务的质量,下面讨论的都是数据报服务
2、IPV4的三种编制方式:
- 分类编址:将IP地址分为5种,分别是A类,B类,C类,D类,E类。只有A,B,C类地址能够分配给主机。
<1>A类编制:
1.网络号:高8位为网络号,第一位固定为0。最小网络号为0,保留不分配。最大网络号为127,作为本地回环测试,不指派。
2.主机号:低24位为主机号。主机号全0的主机号作为网络地址,代表本网络,不分配。主机号全1的网络号作为广播地址,不分配。
<2>B类地址:
1.网络号:高16位为网络号,第一位固定为1。最小网络号为128.0,最大网络号为128.255,均可分配。
2.网络地址:低16位为主机号。主机号全0的主机号作为网络地址,代表本网络,不分配。主机号全1的网络号作为广播地址,不分配。
<3>C类地址:
1.网络号:高24位为网络号,前两位固定为1。最小网络号为192.0.0,最大网络号为192.255.0,均可分配。
2.主机号:低8位为主机号。主机号全0的主机号作为网络地址,代表本网络,不分配。主机号全1的网络号作为广播地址,不分配。
<4>D类地址:多播地址,前3位固定为1。
<5>E类地址:保留地址,前4位位1。
- 网络地址和广播地址:分类编制的A,B,C类地址种主机号全0的都为网络地址,全1的都为广播地址,那么它们有什么用呢?
<1>网络地址:用来代表本网络的地址。比如,对于A类地址中的126.1.1.1,它的网络号为126,为了方便就使用126.0.0.0来表示126。也多亏了当时有这个设计才使得划分子网有实现的可能。由于主机地址全取0,对于126.0.0,我们对网络号全取1得到255.0.0.0,255.0.0.0再与126.1.1.1进行按位与运输得到126.0.0.0,也就是126.1.1.1的网络地址。
<2>广播地址:表示向目的网络中的每台主机都发消息。对于A类地址中的126.1.1.1,它的网络号为126,如果126.1.1.1所在主机想向本网络(也就是网络号为126的网络)中的每台主机都发送消息只需要在IP数据报中设置目的IP地址为126.255.255.255即可。 - 划分子网:
<1>基本概念:对申请到的网络进行划分为若干个小网络,提高对IP地址的利用率。比如某个高校申请到了一个B类网络,网络地址为145.13.0.0,现在要对这个网络划分为更加细粒度的划分。
通过借用主机号的前几位作为网络号,而后面几位作为主机号,通过子网掩码与主机IP地址进行与运算就可以得到主机号。划分子网是三级编址,分别是网络号(A,B,C类的网络号),子网号和主机号。
<2>注意事项:需要注意的是,划分子网是单位内的事,划分后的子网对外仍然表现为一个网络。在外部需要和本单位内的某台主机进行通信时,首先需要根据本但单位的网络地址145.13.0.0找到本单位的网络所在路由器,然后本单位的网络再根据目的子网地址找到主机所在的目的子网,最后将IP数据报交付给目的主机。
- 无分类编制:
<1>基本概念:划分子网解决了A类地址和B类地址中的IP地址浪费问题,而C类地址过小没有得到重复利用。为了解决这个问题,使用了无分类编制,彻底取消了A,B,C类地址(注意D类和E类仍然保留)。无分类取消了三级编址,采用了两级编址,但网络号的长度不再是A,B,C类分类编址中的8、16,24,而是可以取小于32大于0的任意整数值。
使用斜线记法表示无分类编址:比如126.1.1.1/24表示前126.1.1.1的前24位为网络号而后8位为主机号,
<2>路由聚合:将网络聚合为一个更大的网络。
3、路由器与IP地址
一个路由器有多个接口,每个接口都需要配置一个IP地址,并且这个接口的IP地址所在的网络和与这个接口相连的网络需要相同。不过,同一个路由的不同接口的IP地址不需要在同一个网络。
4、IP数据报的发送与转发
- IP数据报的发送与转发
<1>发送:主机发送IP数据报
<2>转发:路由转发IP数据报 - 直接交付与间接交付
<1>直接交付:源IP地址与目的IP地址在同一个网络内,直接将IP数据报发送给目的主机。
<2>间接交付:源IP地址与目的IP地址不再同一个网络内,将IP数据报交给默认网关。
<3>如何判断是直接还是间接交付:通过目的IP地址与源IP地址的子网掩码进行与运行得到目的IP地址的网络地址,目的IP地址的网络地址与源IP地址的网络地址相同就是直接交付否则就是间接交付。
<4>默认网关:网关对应着一个路由接口(也对应着一个IP地址),主机中配置了默认网关的IP地址,在进行间接交付时就将IP数据报发送给这个路由接口,由这个路由接口所在路由进行转发。
- 路由转发:分为两个步骤,检错和查找路由表并交付给下一跳
<1>检错:检查IP数据报的首部,如果出错则报告源主机,如果没有出错就查找路由表并交付给吓一跳。
<2>查表转发:每个路由器都维护了一张路由表,表中的每一行分别有目的网络地址和下一条,下一条就是就是应该将IP数据报交给哪个路,如果目的网络就在这个路由上那下一条就是这个路由上的某个IP地址。查找到目的网络后,转发给目的网络即可。需要注意的是,路由器是根据转发表进行转发的,而转发表是根据路由表得出的,因此这里不区分转发表和路由表。
<3>隔离广播域:当主机发送的IP数据报的目的地址是广播地址(主机号全为1)时路由器不会对该IP数据报进行转发,以防产生广播风暴。
- 静态路由表配置:手动配置路由表,但可能会产生路由环路。路由环路一般由于配置错误或聚合了不存在的路由或网络故障而导致。
- 因特网的路由选择协议:英特网将整个网络分为多个小的网络,每个小的网络成为自治系统(AS),自治系统内部采用内部网关协议(IGP),自治系统之间采用采用外部网关协议(EGP)
<1>内部网关协议:有基于距离向量的(如RIP)和基于链路状态的(OSPF)
1.RIP(路由信息协议),使用跳数作为距离度量,一个路由到直连网络的距离为1,到非直连网络的距离为所经过的路由数加1。一条路径最多包含15个路由器,16等于不可达,因此RIP只适合小型互联网。RIP优先选择经过路由数量少的路径。
RIP工作过程:
一开始每个路由只知道到自己直连网络的距离是1,
每个路由只和自己相邻的路由周期性交换并跟新路由信息。
若干次交换后,每个路由都知道到到本自治系统内每个网络的地址和对应的下一条,称为收敛。
RIP路由条例更新规则:首先对于A发来的路由表进行改造,下一条设置为A,距离加1。然后将改造后的路由表和自己的路由表合并,对于原来的路由表中没有的目的网络直接添加;对于已有的网络,如果下一条相同则使用改造的表中的条目,如果不同则选择距离短的那一条条目。
2.OSPF(开放最短路径优):开发路径优先是基于链路状态的,也就是考虑两个路由之间链路的带宽、费用等,称之为代价,选择一条到达目的网络代价最小的路径。每个路由器都存储一个LSDB(链路状态数据库),一开始只存储到相邻路由的LSA(链路状态通告,简单点理解就是到邻居路由的代价),路由器通过洪泛将自己存储的LSA发送给其他路由,各个路由的LSDB趋于一致。
每个路由器由此构架一个有向图,使用Dijkstra算法就可计算出当前路由到其他路由的最短路径。
<2>外部网关协议(EGP):由于每个自治系统可能采用不同的内部网关协议,因此使用距离向量、链路状态都不合适,也就没有了最佳路径,EGP的目标也就变成了寻址一条尽可能好的路由并且保证不兜圈子。常用的有边界网关协议(BGP)。
1.BGP协议:
每个自治系统选择一个BGP发言人,BGP发言人与其他BGP发言人交换路由信息。
每个BGP发言人根据与邻站交换得到的路由信息来构造一条较好的链路。
- IPV4数据报格式:
<1>标识、标志和片偏移:数据链路层的帧的大小有长度规定,在将IP数据报封装成帧的时候长度可能会超过数据链路层帧的大小,这是就需要将IP数据报分片。
1.表识:属于同一个数据报的分片应该具有相同标识
2.表志:占三个比特,分别是DF位(1表示不允许分片,0表示允许分片),MF位(1表示后面还有分片,0表示后面没有分片),保留位(必须为0)。
3.片偏移:当前分片的数据载荷部分的前面有多少字节的数据。
<2>生存时间:以跳数为单位,路由转发一次IP数据报生存时间减1,如果为0则丢弃该IP数据报,为了防止IP数据报永久兜圈。 - 网际控制报文协议(ICMP):
<1>ICMP差错报告报文:由于英特网不保证提供的服务质量,当路由器由于各种原因丢弃IP数据报时,就会发送ICMP差错报告报文给源点主机。
<2>ICMP差错报告报文的几种类型:终点不可达(网络未知,主机不可达,网络不可达等),源点抑制(网络拥塞时需要控制流量,丢弃报文),时间超过(生存时间到了),产生问题(出现误码),改变路由(找到了一条更好的路径,需要源点重新发送IP数据报)。
<3>ICMP的应用:
1.分组网间探测(ping):用来探测主机与路由的连通性,直接使用IP数据报没有使用TCP或UDP。
2.跟踪路由(traceroute):用来探测源主机到目的主机需要经过哪些路由器,通过设置生存时间为1,2,3,4…,就可以得到第一个路由、第二个路由、第三个路由、第四个路由…。
5、虚拟专用网络VPN和网络地址转换NAT
- 虚拟专用网络VPN:
<1>虚拟专用网络:对于一些专用网络(高校的校园网,企业的内部网络)需要连接不同地方的不同部门,铺设专门的线路将会花费大量的费用,使用因特网可以节省大量费用。
由于IP地址有限,一个机构能申请到的网络地址的数目远小于机构拥有的主机数目。因此虚拟专用网络中各个主机的地址使用的公有地址,不需要额外申请。
<2>虚拟专用网络对外通信(IP隧道技术):由于使用了英特网进行数据传输,两个专用网络必须要使用路由接口接入互联网。专用网络A内一台主机向另专用网络B的一台主机发送数据时,路由器R1先对内部IP数据报进行加密,然后在这个加密的IP数据报上一个首部,源地址就是R1的接口的IP地址,目的地址路由器R2的接口地址。R2收到数据后,去掉IP数据报的首部,解密内部IP数据报,获取源地址和目的地址,然后将IP数据报发送给目的主机。上面介绍的也就是IP隧道技术。
<3>注意点:VPN只允部门内部主机相互访问,称为内联网VPN。允许外部机构参与进来,成为外联网VPN。允许在外办公的员工参与进来,称为远程接入VPN。但是VPN内部的用户不能访问英特网的资源。这是因为专用网络发送和接收数据都需要对需要对数据进行解密,然而互联网上其他的主机并不知道需要解密也不知道怎么解密。
- 网络地址转换NAT:解决VPN不能访问英特网资源的问题。
<1>基本工作过程:需要在专用网络的路由上装一个NAT软件,装了NAT软件的路由称为NAT路由器。NAT路由器拥有若干个全球IP地址,对于专用网络中主机发来的IP数据报,NAT路由器会将IP数据报中的公用IP地址替换为全球IP地址并且将两个地址的对应关系记录在NAT转换表中。NAT将转换过的IP数据报发送出去,目的主机收到请求被发回请求给NAT路由器,NAT路由查询NAT转换表,将全球IP地址替换为原来的公用IP地址,然后发回给专用网中的主机。
<2>缺点:如果NAT路由器中有N个全球网络地址,那专用网络同时最多有N个用户能访问英特网。并且,英特网中的主机不能主动访问专用网络中的主机,因为英特网中主机访问专用网络的主机时在NAT转换表中还没有生存对应的转换关系。 - NAPT:提高了NAT同时访问因特网的主机数量。
由于绝大多数的网络应用都使用TCP或UDP传输数据,并且不同主机上的不同应用程序的IP地址相同的概率较低,因此可以将IP地址与进程端口号一起转换。与NAT一样,英特网中的主机也不能主动访问专用网络中的主机。
四、运输层概述
1、基本概念
- 物理层、数据链路层、网络层共同实现了主机与主机之间的通信,但实际上计算机与计算机之间进行的是进程与进程间的通信,也就是端到端通信(端口与端口之间的通信)。运输层提供了面向连接的TCP协议与面向无连接的UDP协议。
2、端口号、复用与分用
- 端口号:在计算机中每个进程都有一个进程ID(PID),但不同操作系统上的进程ID命名规则不相同,因此在运输层中使用端口号来区分各个进程。端口号用16比特表示,取值范围是0-65535。需要注意的是端口号只在本机起作用,不同主机的端口号没有联系。
<1>熟知端口号:0-1023,指派给了TCP/IP体系中的一些重要协议。FTP使用的是20/21,HTTP使用80,DNS使用53。
<2>登记端口号:1024-49151,需要登记以防重复使用,比如微软远程桌面3389。
<3>短暂端口号:49152-65535,分配给客户进程短暂使用。 - 复用和分用:
<1>发送方不同进程使用同一个运输层协议发送数据称为复用。
<2>接收方多个进程利用同一个运输层协议接收数据称为分用。
3、TCP与UDP
- TCP和UDP的对比
<1>TCP是面向连接的,TCP的通信必须要在两个套接字(socket)之间建立连接,UDP是面前无连接的,不需要套接字。
<2>TCP提供一条全双工的可靠信道,使用流量控制和拥塞控制;UDP提供的是不可靠的信道,不使用流量控制和拥塞控制
<3>UDP支持单播,多播和广播,TCP仅支持单播
<4>UDP是面向应用报文的,对于用户的发来的应用层报文添加UDP首部后直接发送。TCP将应用层的数据视为字节流,一次发送和接收若干字节。
<5>UDP数据报和TCP报文段首部的区别
-
TCP报文段的首部格式:
<1>序号:TCP会将用户的数据以字节为单位进行编号,每个TCP报文段都会携带若干字节的数据载荷部分。序号seq也就是当前数据载荷部分的第一个字节的编号,比如200表示当前TCP报文段的第一个字节是用户数据的第200个字节。
<2>确认序号:接收方接收到数据后,会对收到的数据进行确认呢,此时ACK要设置为1,表示这是一个确认报文,配合确认序号(ack)表示确认收到哪些数据,比如ack=500表示序号为500的字节前面的数据已经收到,希望收到500及其以后的数据。
<3>窗口:接收方窗口大小,单位是字节,比如500就表示接收方窗口大小为500字节。
<4>校验和:检测TCP报文段传输过程种释放出现误码。
- TCP种的滑动窗口:TCP种的滑动窗口与之数据链路层的滑动窗口没有任何关系。TCP的滑动窗口是基于字节的,并不是说TCP一个字节一个字节的发送数据,TCP发送的TCP报文段,一个报文段包含若干字节,一个报文段也将填满接收方的若干窗口。 -
TCP的流量控制:控制发送方发送数据的速度
<1>为什么需要流量控制:对于通信双方,如果发送方的发送速度过快而接收方的接收的速度比较慢就会导致接收方来不及接收数据,进而导致数据丢失
<2>实现方式:滑动窗口
<1>发送数据与移动窗口:发送方维护了一个窗口,这个窗口的大小由接收方确定。发送方只可发送窗口内的数据,接收方会对接收到的数据进来累计确认,比如确认序号为201,则表示201以亲的数据都收到了,发送方既可以移动窗口直到窗口的左端点到达201。接收方还可以使用rwnd=300来控制发送方的窗口大小。
<2>超时重传:如果发送方在规定的时间没有接收对已发送数据的确认就会重传该数据。下图中的一个小格是100字节,实际上一个小格是一个字节,100字节是因为一个TCP报文段中数据载荷部分是100字节(不一定所有的TCP报文段数据载荷部分都是100字节)。
-
拥塞控制:传输数据不仅仅与接收方的接收速度有关还与网络中的资源有关(比如网络的带宽和路由器缓存的大小)。如果对网络中某一资源的请求超过了网络可以提供的大小网络性能就会降低,这种情况就叫做拥塞,也就类似与高速路上堵车。
<1>拥塞实现的的目的:在输入负载不断增加的情况下能够保证网络的吞吐量不降低。
<2>拥塞控制实现的本质:与流量控制的类似,也是控制发送方发送的速度,但根据网络资源的状况来控制,而接收方。
<3>拥塞控制的实现:发送方维护一个叫做拥塞窗口cwnd的变量(其实也是一个滑动窗口),动态的调整窗口的大小(没有拥塞就增大拥塞窗口,发生拥塞就减小拥塞窗口)。判读拥塞的标志就是没有发生超时重传。拥塞窗口大小的改变分为4个阶段:慢开始,拥塞避免,快重传,快恢复。
1.慢开始:cwnd拥塞窗口的大小,ssthresh门限,swnd发送窗口的大小。这里swnd与cwnd保持一致,实际上swnd取的是cwnd和rwnd(接收方的窗口大小)的最小值。cwnd一开始设置为1,然后取 2 1 2^1 21, 2 2 2^2 22,…,直到与ssthresh大小相同。
2.拥塞避免:每次窗口拥塞窗口值增加1,如发送超时重传设置拥塞窗口值为1,并且ssthresh值设置为发生拥塞时cwnd值的一半。
3.快重传:不等待超时计时器时间到才重传数据,而是接收方重复确认了3次就重传数据,避免将拥塞窗口设置为1。并且接收方每接收一个数据报就确认一次,这不同于流量控制中的累计确认。确认M2表示M2及其之前的数据已经收到,如果收到M4仍然会确认M2,因为M3还没收到,这样发送方就知道M3可能丢失了,联系确认3次M2后发送方就会重新发送M3。
4.快恢复:进行快重传之后,发送方不认为发生了拥塞,但会认为网络可能会发生拥塞,需要降低发送的速度。将拥塞窗口大小设置为当前窗口大小的一半,ssthresh也设置为当前窗口大小的一半。
-
可靠传输的实现:
<1>丢失:TCP可靠传输使用基于字节流的滑动窗口来实现(其实和可以看出流量控制和拥塞控制中的滑动窗口的结合),发送窗口的大小取的就是rwnd(流量控制中得出的滑动窗口大小)和cwnd(拥塞控制中拥塞窗口的大小)的最小值。
<2> 乱序:对于不按序到达的数据一般有两种处理方式:直接丢弃(类似与数据链路层中的GBN),对于不按序到达的先放在接收窗口内,当缺少的字节到达后再提交(这与数据链路层的选择重传SR并不相同,SR采用了对每个分组分开确认的方式而TCP使用的是累计确认,并且也不与GBN相同,因为接收方窗口可以不为1并且不需要重传发送方窗口内所有数据)。TCP一般使用第二种,前面介绍的也是第二种。
<3>误码:检测出错后丢弃并且重传数据。 -
TCP运输连接管理:分为三个阶段:建立连接,数据传输,释放连接。
<1>建立连接(三报文握手):采用C/S模式,主动发起连接的叫TCP客户端(client),被动等待连接建立的叫TCP服务器(server)
1.一开始,双方都处于关闭状态。
2.TCP服务器创建传输控制块,进入监听状态,等待TCP客户端进程的连接请求。TCP服务器进程被动等待服务端客户端进程的连接请求,因此也成为被动打开连接。
3.TCP客户端创建进程控制块,发送连接请求报文段并进去同步已发送状态,由于连接是客户端主动发起的,因此也称主动打开连接。
SYN=1表示这是一个请求报文段,seq=x表示这个请求报文段的需要。
4.TCP服务器接收到请求后,如果同意连接则进入同步已接收状态,并且向TCP客户端发送连接请求确认报文段。SYN=1,ACK=1表示这是一个连接请求确认报文段,seq是这个确认报文段的序号,ack=x+1表示对seq=x的确认。
5.TCP客户端接收到连接请求确认报文段后进入连接已确认状态并且发送一个普通的TCP确认报文段给TCP服务器。
6.TCP服务器端接收到确认报文段后进入连接已建立状态。
7为什么需要三次握手:为了防止已经失效的连接请求又到达TCP服务器端,进而导致TCP服务器盲等连接的建立。
<2>释放连接(四报文挥手):TCP连接是全双工的,双方都可已发送数据。通过两次握手一方可以停止发送数据但还要接收数据,连接变成半双工。再通过两次握手,另一方也停止发送数据,这时连接才正式关闭。
1.TCP客户端发送TCP连接释放报文段,并进入终止等待1状态。FIN=1,ACK=1表示这是一个连接释放报文并且对之前TCP服务器端的报文进行确认也就是ack=v。sqe=u是这个连接释放报文的的序号。
2.TCP服务器进程收到TCP连接释放报文段后,会发送一个普通的TCP确认报文段并进入关闭等待状态。这时连接已经变成了半双工的状态,TCP客户端进程不再发数据但能接收数据,服务器端仍然能发送数据。
3.TCP客户进程收到确认后进入终止等待状态,这时TCP客户端还能接收数据。
4.TCP服务器进程若已经没有数据要发送则发TCP连接释放报文,FIN=1,ACK=1表示这是一个连接释放报文并且对之间的报文进行确认,然后TCP服务器进程进入最后确认状态。
5.TCP客户进程收到连接释放报文后就发送一条普通TCP报文进行确认,TCP服务器进程收到连接后进入关闭状态。TCP客户端会进入时间等待状态,等待2MSL后就进入关闭状体。
<6>为什么需要等待2MSL:TCP客户进程发送的确认报文可能丢失,如果直接关闭将导致TCP服务器进程一致处于最后确认状态。此外,经过2MSL,服务器端发送的数据报将从网络上消失,这样可以避免与下一次连接的数据报冲突。
五、应用层
1、常见应用
- 动态主机配置协议DHCP:
<1>为主机手动配置IP地址容易出错并且耗费时间,使用一台服务器来为主机自动提供IP地址配置的服务将会节省大量时间。
<2>工作过程:主机向DHCP服务器请求IP地址,如果DHCP服务器上有该主机的信息就返回IP地址给该主机,如果没有DHCP服务器从IP地址池中选一个地址并返回。
<3>DHCP服务器只能为本网络内的主机提供IP地址配置的服务,本网络外的主机不能使用本网络内的DHCP服务器的服务。但给每个网络都配置一台DHCP服务器太过浪费,通过给路由器配置DHCH服务器的IP地址使之称为DHCH中继代理,外部网络就可以使用本网络内的DHCP服务器的服务。
- 域名系统DNS:域名相对于IP地址比较容易记忆,用户主机在通过域名访问一台主机时先要向DNS服务器发送请求,DNS服务器根据域名找到IP地址,然后将IP地址返回给用户主机。
<1>域名:采用分层结构,以点分割,越靠右的域名等级越高,比如xxx.xxxx.xxx.xx。在顶级域名中net表示网络服务机构,com表示公司,org表示非盈利性组织,int表示国际组织,gov、edu、mil表示美国政府部门、美国教育机构、美国军事部门,cn,uk,us,表示中国、英国和美国。
<2>域名服务器的等级结构:
1.根域名服务器:等级最高,知道顶级域名器的域名及IP地址对应关系。根域名服务器一般不对域名直接进行解析,而是返回该域名所属的顶级域名服务器的IP地址。
2.顶级域名服务器:知道所有二级域名服务器的域名及其IP地址的对应关系,查询的结构有可能就是最终的IP地址也有可能是三级域名服务器IPd地址。
3.权限域名服务器:负责管理某个区的域名,并且也知道下级域名服务器的域名及其IP地址的对应关系。
4本地名服务器:起着代理的作用,将域名请求转发给上述域名服务器中。
<3>域名请求过程:本地域名服务器会缓存一些域名和IP地址的对应关系,如果找到则返回,否则发送给根域名服务器。对于迭代查询,根域名服务查找域名所在的顶级域名服务器的IP地址(比如对于www.baidu.com会先查找com域名所在的顶级域名服务器),然后将IP地址返回给本地域名服务器。本地域名服务器再根据IP地址去顶级域名服务器中找,依次迭代知道找到目的IP地址。对于递归查询,根域名服务器会将对应的域名解析请求发送给顶级域名服务器,顶级域名服务器再交给下一级域名服务器。找到后,再依次返回。
- 文件传输协议FTP:FTP客户可以向FTP服务器上传文件也可以从FTP服务器上下载文件。
- 电子邮件:包括邮件发送协议(如SMTP)和邮件读取协议(POP3、IMAP)。发送方使用SMTP协议将邮件发送到发送方邮件服务器上,发送方邮件服务器再适合用SMTP协议将邮件发送给接收方邮件服务器,接收方使用POP3协议取回邮件。
基于万维网的电子邮件:发送邮件和接收邮件都使用的HTTP协议,而邮件服务器间使用SMTP发送邮件。
2、http协议
- 万维网:
<1>URL与URI:
1.URI:标记了一个资源,比如一个人的身份证号就是这个人的URI。
2.URL:给出了一个资源的地址,比如一个人的住址。万维网使用URL来访问服务器上的资源,URL格式:<协议>://<主机>:<端口>/<路径>,比如https://www.baidu.com/index.html就是百度首页(index.html)的地址。其实https://www.baidu.com/index.html也可以看作百度首页(index.html)的URI,因为它唯一标志了百度。
<2>cookie和session:
1.cookie:存储在客户端,由服务器端发给客户端并存放在客户端
2.session:存放在服务器端,记录了用户的登录状态等。
3.通过cookie来保存状态信息:http协议是一种无状态协议,不保存用户的登录状态等信息。如果浏览器是第一次访问某个web应用,web应用会自动创建一个session保存相关的信息,并且创建一个键为“JSESSIONID ”值为“xxxx”的cookie返回给浏览器,浏览器存储cookie,下次访问这个web应用时会将cookie发送给服务器,服务器通过JSESSIONID来查找对应的session。随着浏览器的关闭,cookie会自动消失,这时session也就再获取不到了因为不知道session的ID,也就称为这次会话关闭了。
<3>http请求的过程:
1.获取URL中的域名
2.向DNS获取域名对应的IP地址
3.使用TCP协议建立TCP连接
4.使用TCP连接请求数据
5.返回数据给浏览器
<4>http的长连接和短连接:
短连接:一次请求就建立一个TCP连接,服务器端发回响应就关闭连接。
长连接:发回响应会在响应都中设置Connection:keep-alive,不马上关闭连接,以后的http请求也使用这个连接,超时后才会关闭连接。
<5>端点续传:下载中断后,请求头中会有Range: bytes=start-end 来指定下载的范围。
<6>常见状态码:
(1)1xx:请求处理中
(2)2xx:请求成功;200请求成功无返回值,204请求成功有返回值
(3)3xx:重定向
(4)4xx:请求不合法;400客户端请求报文错误,401客户端未认证,403没有权限访问,404找不资源,405不支持该请求方法,比如一个controller只接收GET请求,发来的是POS请求。
(5)5xx:500服务器内部错误,503服务不可用,停机维护等,505http协议版本不受支持。 - Http不同版本的区别
<1>http1.1与http1.0:http1.1支持长连接而http1.0使用的是短连接。http1.1多次http请求可以使用一次tcp连接,减少了建立tcp连接的开销。
<2>http1.1和http2.0:http2.0使用了多路复用,一个连接可以并发处理多个请求。
https://blog.csdn.net/ailunlee/article/details/97831912
长连接适用于交互频繁,点对点的通信,例如网络游戏,实时通信。短连接适用于用户数量巨大的web网站,例如京东,淘宝等,不然数量巨大的客户端一直长连接会给服务器带来巨大的消耗。
3、https
- http协议的缺点
<1>通信使用明文(不加密),内容可能会被窃听
<2>不验证通信方的身份,因此有可能遭遇伪装
<3>无法证明报文的完整性,所以有可能已遭篡改 - 对称加密算法(共享密钥加密)
<1>什么是对称加密:加密和解密都使用同一个密钥
<2>对称加密算法的优点:算法公开、计算量小、加密速度快、加密效率高
<3>对称加密算法的缺点:使用对称加密算法的双方都需要知道密钥,一方如何将密钥传给另一方是一个难题。在网络中,直接传输密钥可能会被第三方截获,造成密钥的泄漏。
- 非对称加密算法
对称加密算法无法安全的传输密钥,而非对称加密算法可以很好的解决这个问题。
<1>对称加密算法:服务器端持有两把钥匙,将公钥发送给客户端,私钥自己持有不告诉任何人。客户端使用公钥对数据进行加密,将加密后的数据传给服务器端,服务器端使用私钥进行解密。
上面只画了客户端向服务器端发送数据的情况,服务器端向客户端发送数据的情况与上面类似,客户端也需要持有两把钥匙并将公钥发给服务器端。
<2>RSA加密算法:RSA加密算法是一种经典的非对称加密算法。
步骤 | 说明 | 描述 |
---|---|---|
1 | 选择一对不相等的且足够大的质数 | p , q p,q p,q |
2 | 计算 p , q p,q p,q的乘积 | n = p ∗ q n=p*q n=p∗q |
3 | 计算欧拉函数 | φ ( n ) = ( p − 1 ) ∗ ( q − 1 ) \varphi(n)=(p-1)*(q-1) φ(n)=(p−1)∗(q−1) |
4 | 选一个与 φ ( n ) \varphi(n) φ(n)互质的数 | 1 < e < φ ( n ) 1<e<\varphi(n) 1<e<φ(n) |
5 | 计算出e对于 φ ( n ) \varphi(n) φ(n)的模反元素 d d d | d ∗ e m o d e n = 1 d*e\ mode\ n = 1 d∗e mode n=1 |
6 | 公钥 | K U ( e , n ) KU(e,n) KU(e,n) |
7 | 私钥 | K R ( d , n ) KR(d,n) KR(d,n) |
8 | 对 M M M进行加密得到 C C C | C = M e m o d e n C=M^e\ mode\ n C=Me mode n |
9 | 对 C C C进行解密得到 M M M | M = C d m o d e n M=C^d\ mode\ n M=Cd mode n |
公钥和私钥中都有一个公共的数n,并且有各自私有的数e和d。加密的函数就是先求幂再求模。
互质:两个数除了1没有公因数
欧拉函数:能求得小于n的正整数中与n互质的数的数目
-
Hash函数MD5:本质上是一个hash函数
工作过程:
<1>给定4个标准幻数,每个幻数四个字节
<1>填充对其:将输入地数据补齐为512bit的整数倍
<2>分块
一块为512bit
<3>多轮压缩:
每个块参与一次压缩,每次压缩分为四轮,对给定的四个幻数进行更新。
破解的三种策略:
<1>原项攻击:通过Hash值推出原始数据(不可行,因为数据丢失了)
<2>第二原项攻击:对于给定的数据,找到一个数据与其Hash值相同(目前无法实现)
<3>碰撞攻击:找到两个Hash值相同的数据(已实现)。 -
数字签名:验证数据是否被篡改过
数字签名算法的过程:
<1>服务器端要向客户端发数据,向将公钥发给客户端。
<2>对于这段数据,服务器先使用Hash函数(MD5 、 SHA-1等)计算得到指纹(Thumbprint)。再对指纹和Hash函数使用私钥(这里不可使用公钥加密,否则其他人也可得到签名)加密,得到数字签名(Signature),传输数据时将签名、加密后的Hash函数和数据一同传输。
<3>客户端收到数据和签名后,先对数据进行Hash运算得到一个指纹,然后对签名使用公钥进行解密得到另一个指纹,比较两个指纹是否相同,如果相同则说明数据没有被修改。由于签名是使用私钥得到的,而私钥只有服务器得到,因此不用担心别人修改数据后自己生成签名。 -
数字证书:证明公钥的正确性(公钥没有被篡改)
<1>非对称加密的缺陷:在使用非对称加密算法时,如果中间人截获了客户端的请求,并发给客户端伪造的公钥。客户端用伪造的公钥将数据发给中间人,中间人使用伪造的私钥对数据进行解密就可以得到客户端端发来的数据。中间人在向服务器端发送申请,得到服务器的公钥,使用服务器的公钥加密数据并发给服务器,服务器将响应发回给中间人。整个过程中,中间人可以获取所有的信息,但服务器、客户端都没有意识到中间人的存在,造成严重危害。
<2>数字证书:证明公钥是正确的而不是别人伪造的。
在上面的例子中,由于客户端没有对公钥进行验证,导致使用了中间人提供的伪造的公钥,进而导致发送的数据被中间人解密。如果能够判断公钥是不是服务器提供的,就能保证数据不被泄漏。而证书就是一个公钥的凭证。
数字证书的基本结构
字段 | 说明 |
---|---|
证书的发布机构(Issuer ) | 数字证书的颁发机构 (CA,Certificate Authority) |
有效期从(Valid from) | 数字证书有效期的开始时间 |
有效期到(Valid to) | 数字证书有效期的截止时间 |
公钥(Public key) | 需要被证明的公钥 |
使用者(Subject ) | 数字证书的所有者 |
签名算法(Signature algorithm) | 这个证书的数字签名所使用的加密算法。使用证书发布机构的证书里面的公钥,根据这个算法对签名进行解密就可以得到这个证书的指纹。签名、指纹已经在前面的数字签名一小节中结束过。 |
指纹(Thumbprint) | 也就是这个证书的Hash值,用来验证证书是否被篡改过。在传输的过程中,指纹也会被放入证书中。需要注意的是为了防止指纹被篡改,传输的时候指纹会使用证书发布机构的私钥进行加密(也就是这个证书的签名)。 |
指纹算法(Thumbprint algorithm) | 也就是Hash函数,接收者在收到证书后,也会对证书使用Hash函数计算得到一个指纹,如果这个指纹和签名解密后得到则指纹是相同的说明这个证书是安全的,没有被篡改过。需要注意的是,指纹算法也会使用证书发布机构的私钥进行加密。 |
上面提到的证书的内容中,除了指纹算法和指纹外都是明文传输的。由于指纹和指纹算法都使用了证书机构的私钥进行加 密,那我们就需要获得证书机构的公钥进行解密。通过网络传输公钥有可能导致公钥被截获然后被篡改,为了解决这个问题,操作系统(比如Windows,Android等)会存放这些证书机构的证书(证书机构的证书一般由自己生成),而证书机构的证书里就包含了证书机构的公钥。
查看操作系统中的证书机构的证书:输入win+r,然后输入certmgr.msc。
下面是百度的数字证书:这里的指纹和Hash算法都解密过的。
<3>数字证书的申请和使用:服务器向认证机构申请证书。认证机构生成数字证书,然后生成数字证书的指纹,再利用自己的私钥对指纹和指纹算法进行加密,然后将加密后的指纹和指纹算法放入数字证书,发回数字证书给服务器。服务器发送数字证书而不是公钥给客户端,客户端对数字证书进行验证,判断公钥是否正确。
<4>客户端数字证书:数字证书不仅仅存在于服务器端,客户端也可以申请数字证书,对于某些服务器(比如金融机构),它只允许自己的客户访问服务器,这时候客户就需要提供客户端证书(金融机构提供的USB密钥中就包含客户端证书)。
- https = http + 加密 + 认证 + 完整性保护。
https并不是应用层新的协议,只是 HTTP 通信接口部分用SSL(Secure Socket Layer)和 TLS(Transport Layer Security)协议代替而已。
<1>SSL和TSL的区别:TLS 1.0通常被标示为SSL 3.1,TLS 1.1为SSL 3.2,TLS 1.2为SSL 3.3。对于SSL1.0和SSL2.0,由于存在漏洞都未被采用。
<2>SSL协议工作过程:
主要分为握手阶段和通信阶段,握手阶段双方协商生成“对话密钥”(使用非对称加密方式),通信阶段双方采用“会话密钥”进行加密通信(对称加密方式)。
握手阶段详细工程:
1、客户端向服务器发出加密通信的请求(叫做ClientHello请求)。请求包含如下信息:
支持的版本协议(比如TLS 1.0),一个客户端生成的随机数,支持的加密方法(比如RSA)。
2、服务器回应(SeverHello),包含如下信息:
确认使用的协议版本(比如TLS 1.0),一个服务器生成的随机数,确认支持的加密方法(比如RSA),服务器数字证书。
3、客户验证数字证书,如果证书没有问题客户端从证书中取出公钥,生成一个随机数(pre-master key,预主密钥)。到此,客户端拥有三个随机数,客户端通过一个密钥导出器根据这三个随机数导出一个对称密钥(会话密钥,用于本次会话的一个密钥)。然后客户端发送如下消息:
使用公钥加密过后的预主密钥,编码改变通知(表示以后的信息都使用会话密钥进行加密传输),客户端握手结束通知(表示客户端的握手阶段已经结束)。
4、服务器收到预主密钥后使用私钥进行解密。到此,客户端拥有三个随机数,客户端通过一个密钥导出器根据这三个随机数导出一个对称密钥(会话密钥)。服务器端发送如下信息:
编码改变通知(以后都使用会话密钥进行加密),服务器握手结束通知。
到处握手阶段已经结束。
数据传输阶段:服务器端和客户端进入加密通信阶段,二者采用http协议传输数据,只不过传输的内容需要使用会话密钥进行加密。
<3>SSL协议为什么需要三个随机数而不只使用预主密钥:预主密钥本身是一个随机数,但这里的随机只是伪随机(通过特定程序生成)并不是正在的随机,很有可能推导出这个伪随机数。使用三个伪随机数来生成会话密钥,这个密钥就十分接近正在的随机数了,可以保证密钥的随机性。
<3>SSL协议为什么同时使用对称加密和非对称加密:对称加密没有办法安全传输密钥,使用非对称加密算法传输密钥。而非对称加密算法比较耗时,在传输密钥成功后使用对称密钥算法比较节约资源。
https://www.cnblogs.com/JeffreySun/archive/2010/06/24/1627247.html
https://www.ruanyifeng.com/blog/2014/02/ssl_tls.html
https://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html
4、客户/服务器方式(C/S方式)和对等方式(P2P方式)。
- 客服/服务器方式(C/S):客户是服务请求方,服务器是服务提供方
- 对等方式(P2P)方式:没有固定的服务请求者和服务提供者,网络中的各进程是对等的被称为对等方,每个对等方既是服务请求者又是服务提供者。