1.因特网是互联网的主干网络 特指由TCP/IP协议构建的互联网,是全球最大的一个互联网;互联网是若干电子计算机网络互相连接而形成的网络,包括局域网广域网等
2局域网一般单位自己组建,带宽小 覆盖范围小,广域网则一般租用运营商线路,用于长距离通信,比如同企业不同分公司
3. OSI七层模型是一种网络传输过程模型
4-7为高层:在通信主机上完成 1-3层在网络设备上进行消息转发
4.表示层是负责对信息进行正确的加密解密、编码解码和压缩解压的过程
5.公网两个DNS服务器地址 8.8.8.8 114.114.114.114
6**.子网掩码作用**:
(1)区分网络和主机地址
子网掩码配合IP地址使用,将32位的掩码与IP进行与运算,得到的便是网络地址(网段),将子网掩码取反然后与IP进行运算,得到的是主机编号
(2)划分子网
7.TCP/IP协议是一个簇,家族
8.网络通讯的各层
(1)运输层 添加了TCP协议的数据单元称为数据段(Segments),UDP协议数据单元称之为数据包(Datagrams)
UDP头部
(2)网络层添加了网络层首部的数据段称为数据包(Packets)
(3)数据链路层要增加数据链路层首部,包括源MAC地址和目标MAC地址 ,加了该头的数据包称为数据帧(Frame)
封装后的报文
(4)物理层将帧的数字信号转换成点信号(bit)传输
9.数据封装: 原始数据->段->数据包->以太帧的过程
10.常见设备的作用
(1)网卡负责将数据包组成以太帧,并将帧转为bit流,因此工作在物理层和数据链路层
(2).路由器的接口收到bit流,会将电信号转为数字信息,判断mac地址是否是自己,如果是,则去掉帧首部,然后根据IP地址选择路由路径,然后重新封装成帧,其接口会将数字信号转为电信号发出,即路由器工作在物理层和数据链层以及网络层
(3).交换机收到电信号后转为mac地址,然后根据mac地址转发数据帧, 看不到网络层首部和传输层首部,只工作在数据链路层和物理层
11.网络性能指标
(1)网络速率:每秒传输的bit数量,一般如果说kb/s或者Mb/s k=10的3次方,M10的6次方,如10M网速,说的是1010^3b/s 即1s传输的bit数量,换算成字节的话还得除以8;
测速软件一般显示的 MB/s和KB/s 是指的字节(大写的B),即大写B表示字节单位,小写b表示位单位
(2)带宽表示通信线路传输数据的能力,即最高速率,如:10G带宽,表示 最高传输速率为 1010^6bps
(3)时延 往返时间 可通过ping查看
命令ping ip -l(L) number 能够发送设定长度的数据包
(4)利用率
网络有百分之几的时间被利用(有数据通过),没有数据通过的网络利用率为0,利用率越高,路由器和交换机处理数据包的时间就越长,时延就越大,因此一般不能大于50%,计算公式:
D=D0/(1-U) d0为网络空闲时延,u表示网络利用率
12.网络分类
局域网,广域网跨距离长,将多个局域网连接起来,需要租用供应商的线路,定期购买带宽
13.网络协议的三要素:
语法是数据和控制信息的结构和格式;语义是控制信息的含义;同步,即发送数据的顺序
二、物理层
1.数据通信模型
(1)局域网通信模型
数字信号通过集线器或者交换机进行发送,不需要对数字信号转为模拟信号
(2)广域网通信模型
数字信号需要转为模拟信号
2.数字信号和模拟信号
(1)模拟信号是用连续变化的物理量表示的信息,压力温度电压等,模拟信号传输是把信号模拟成与原来几乎一模一样,但由于传输容易受干扰,最终还原后会失真
(2)数字信号
信息的参数取值是离散的,数字信号传输中常用单位时间内相同的符号来表示一个或多个二进制数字,称为码元
(3)模拟信号转为数字信号
模拟信号一般会通过脉码调制方法量化为数字信号,通过采样将模拟信号量化,然后再通过不同位数的bit表示信号的宽度,歌曲一般也是模拟信号转为数字信号存储的,下载时不同的品质,采用不同位数的bit近似表示模拟信号,因此大小不同,一般语音信号采取8位编码,2的8次方法=256个量级
3.信道
单工通信:任何时刻数据的传递方向是单一且唯一的,如无线广播
半双工通道:数据可以双向传递,但是得交替进行,同一个时刻只能有一个方向,如某些对讲机
全双工通道:数据同时可以在两个方向上传播
4.宽带接入技术
(1)宽带并无统一定义,USA2015年将上行速率1Mbps改为3Mbps称之为宽带
(2)铜线接入(电话线接入)
(3)有线电视线路
(4)光纤接入
(5)移动互联网接入 3G 4G 移动通信的网络结构有两种,一种是全IP网络架构,基站要负责网络传输,和接入路由器的功能,当移动端从一个基站移动到另外一个基站时,需要对移动端IP重新配置;
另一种是子网IP架构,临近的基站组成子网,接入统一的路由器
算法可视化网站
https://visualgo.net/en
https://algorithm-visualizer.org/branch-and-bound/binary-search-tree
三 数据链路层
1.信道类型有两种
点对点信道和广播信道
2.数据链路是普通物理线路+一些工作在该层的通信协议,这些协议通过网络适配器(软硬件都有)实现,适配器工作在数据链路层和物理层
3 链路层有三个基本问题
(1)封装成帧
对于IP数据包加上帧首部和尾部形成帧,首部尾部重要作用是帧界定,如只有首部没有尾部的帧会直接抛弃,为提高帧传输效率,数据部分应该尽量大于帧首部和尾部,但是有个上限即 最大传输单元 MTU;如果是ASCII码字符,则帧界首部一SOH(ACSII码中规定的控制字符0x01,而非字符串SOH)开始,尾部EOT(ASCII 0x04)结束
(2)透明传输
如果传输数据部分出现 帧控制符,要能够正确处理,即数据传输要完全不受链路层的影像,即链路层透明,解决办法是字节填充法,在数据部分出现了类似“SOH”等定界符时,在其前面加转义符,如果有数据本身与转义符冲突,则加两层转义符,链路的两端要能够正确识别
(3)差错检测
比特在传输过程中可能会产生差错,比如1变0,这个叫比特差错,不可避免,一般通过循环冗余检验CRC,即在发送的数据后面加冗余数据,有了差错检测,则可以认为接收端数据链路层接收的帧均无差错;
差错检测只检测比特差错的问题,而对于帧对视、重复和帧失序均无法检测
4.链路层协议--点对点协议PPP,点对点链路都使用此协议
(1)PPP协议只支持全双工链路,只支持点对点链路,而不支持一个主站好多从站这种模式
(2)ppp协议的组成部分:一个将IP分组封装到串行链路的方法;一个用来建立配置和测试数据链路连接的链路控制协议LCP;一套网络控制协议,每个协议支持不同的网络层协议如IP以及APPleTalk等
ps: MTU默认是1500字节
(3)PPP的帧格式
首部和尾部定界符固定为0x7E,第二三个字段为固定为0xFF和0x03,未携带任何帧数据,第四字段为2字节的协议字段,0x0021表示信息部分就是IP数据包,0xC021则表示信息部分为LCO数据,0x8021表示网络层的控制数据(如对PPP连读的每一段配置IP,此时就是IP控制协议IPCP的数据),第四字段对应的协议和代码值 可查看:http://www.iana.org/
信息字段最大长度为MTU(1500B)
5 链路层协议-- 使用广播信道的数据链路层
(1)局域网的数据链路层
局域网(基本等价于以太网)是一种广播类型的协议
wireshark 过滤规则 https://blog.csdn.net/liuchaoxuan/article/details/81605257
5 使用广播信道的数据链路层
(1)局域网的数据链路层 特点之一就是具有广播功能,几乎等价于以太网
在局域网上实现点到点通信原理:
在局域网上A给B发消息,会同时将该帧发往该链路上的所有机器(即广播信道),要在广播信道上实现PPP通信,则需要在帧中包括源地址和目标mac地址,同时mac地址唯一,计算机中网卡会解析该帧,当地址与自身mac一致时,则处理,否则丢弃,而ppp链路中没有目标地址
(2)适配器即网卡,集成了软件和硬件工作在数据链路层和物理层,在接收和发送各种帧时,不使用CPU,当收到错误帧时直接抛弃,收到正确帧时就通过计算机,同时计算机的硬件信息如mac地址存储在适配器的ROM中(断电保存),而软件信息如ip地址,则在计算机中
(3)局域网中一台计算机发送数据帧时,每一台都能检测到该数据,只是当数据帧中的目的地址与适配器 中ROM的硬件地址一样时,才会接受并处理这个帧,否则丢弃,从而实现一对一通信,但并不是PPP协议
(4)以太网在数据链路层发送时无连接和不可靠交付,这些给上层协议
(5)局域网中当一台发送数据时,其他台必须监听,否则会发生消息碰撞,采用的解决一些事CSMA/CD协议
6 集线器的特点:
采用集线器的局域网在物理上是一个星形网,在逻辑上仍是总线网,仍使用CSMA/CD协议,同一个时刻只允许一个站发送数据;集线器可同时连接好几个机器;集线器工作在物理层,只是做比特流信号的转发,不进行碰撞检测
7.网卡
(1)工作在物理层和数据链路层,负责帧发送接收,封装成帧,差错检验,数据编码解码,还能能过实现以太网协议CSMA/CD协议
(2)网卡上装有简单处理器和存储器(RAm和ROM),与局域网通信通过电缆,而与计算机通信则通过主板上IO总线
(3)MAC地址 在局域网广播信道上实现点对点通信,就是通过适配器识别帧中的mac地址与自身rom中是否一致来实现的;48位6字节,高24位由IEEE购买,表示的是生产网卡的公司唯一的标识符
路由器也有mac地址
(4)发往网卡的帧包括三种:
单播帧,帧的MAC地址与本站硬件地址相同;广播:帧头目的地址全为1;多播;前两种是必须要求能够识别的
(5)IEEE规定地址字段第一字节的最低位为I/G位,individual/group,0表示地址字段为单个站地址,1表示组地址,第一字节的最低第二位为G/L为,0位全球管理(全球无相同地址),1表示本地管理,以太网不理会该G/L位
(6)MAC帧的格式
使用最多的一种是以太网V2,即Ethernet II
ps:抓包工具看不到帧定界符和帧校验序列等即上图的前8字节,因为这些在接收到帧以后就去掉了
这里是抓包的结果
ps:通常通过以太网发送的信息都是MAC帧格式(ehtnet II )的,以太网是一种广播类型的协议,而PPP协议的帧格式则需要专门指定路由器通过ppp协议发送
8.以太网范围的扩展
(1)物理层 可使用多个集线器(效率低)
(2)数据链路层扩展–交换机
网桥是对接收到的帧根据mac帧目的地址进行转发和过滤,当收到帧时,根据mac地址查找网桥中地址表,然后转发或者丢弃;
现在的交换机都特指以太网交换机,一种多接口网桥,每个接口对于其他主机对接,全双工方式并行交换数据,通信主机都是独占资源,无碰撞传输,同时会在某个接口繁忙时将帧缓存一下;内部有地址表,通过自学习算法建立,硬件转发, 效率很高
网桥和交换机存在的意义:局域网中当一台发送数据时,其他台必须监听,否则会发生消息碰撞,直接通过集线器连接本质上还是总线连接,如图,A-D通信时,B-E无法通信**,增加交换机能够进行mac地址和交换机上接口的匹配,这样,直接将消息转发到对应接口,就不会广播到其他机器,即B向E发送消息也不会受到A-D通信影像**
交换机组件的局域网就是广播域,路由器负责在不同局域网之间转发数据,广播的数据不能夸路由器,即路由器隔绝广播
四、网络层
1.IP地址分类
(1)网络号前面的1-3位是类别位,是固定的,分别是A类:0,B类:10,C类:110,D类:1110为广播地址
(2)常用的三种IP地址
A类可用2^7-2=126个网络号,全0表示本网络(0.0.0.0);而网络号为127(01111111)表示环回测试本主机进程之间的通信,不会出现在网络上,也就是127开头其实都是本地环回测试的地址,而不仅是127.0.0.1
(3)常用IP地址范围和特殊IP含义
2 IP的一些特点:
同一个局域网主机IP的网络号必须一样
网桥或者交换机只能应用在局域网中,即仍是一个网络号
路由器总是有两个或两个以上IP地址,每个接口都有一个不同网络号的IP地址,连接不通的局域网
3.ARP地址解析协议—将局域网(同网段)设备的IP地址和mac地址做映射,在数据链路层传输都是找的mac地址
每台主机都有个ARP高速缓存,保存本局域网上歌主机和路由器的IP地址和mac地址的缓存表,工作过程如下:
(1)同网络A–>B,当ARP缓存中有B的mac地址时,直接将该地址放在mac帧头发送数据,如果没有,则向广播地址发送ARP请求,对应ip的主机就会response自己的mac地址,其他主机忽略该arp请求,同时B会保存A的ip和mac对应
(2)跨网络A–>B,A广播的请求会被该局域网的路由器响应,然后A发送数据到路由器R1,R1会在自己所连接的另一个局域网广播,如果没有目标IP主机,则R1局域网中的另一个路由器则会响应该广播,给R1自己的MAC地址,然后数据从R1–>R2,以此类推找到目标主机为止
ps:ARP请求是广播,但是ARP响应是单播,另外ARP只在局域网中运行,如果没有ARP高速缓存,每次发送数据都要先广播,会非常占用信道,同时路由器默认不转发广播帧
ARP抓包
分析:当从 100.120.4.103 ping 100.120.4.97时,由于103上最开始arp缓存并没有97的mac地址(可通过arp -a查看103arp缓存)这时候就会通过arp协议发广播,这样97就会答复该广播,然后再通过arp-a查看arp缓存时就会发现有了97这台ip
4.保留的IP地址
主机ID都为0的地址:特指某网段 eg:192.168.10.0,255.255.255.0
主机ID都为1的地址:表示该网段的全部主机,如ping目标IP为192.168.10.255(子网为255.255.255.0),则通过wireshark能够看到mac地址为广播地址
127.0.0.1为环回测试地址,用于本机上进程间通信用,有没有网卡都能ping通
0.0.0.0:如果ip和网络中其他计算机冲突,则会展示为该网络
5 IP协议格式和抓包分析
5.IP数据报的格式
首部和数据部分
(1)首部各字段,首部分为固定长度和可选字段,其中固定长度共20字节
i 版本 4位 常用版本号位4 ;
ii首部长度 4位,可表示的最大十进制数是15,但是这里数字单位是32位字,即1表示4字节,首部固定长度20字节,限制该字段最小是5(0101);当首部长度不是4字节整倍数时,需要填充字段,即数据部分永远在4字节的整倍数开始,常用的首部长度就是20,即这里是5(0101)
iii区分服务 占8位 几乎不用,区分服务字段differentiated Services 当配置某些数据包需要特殊处理时使用,比如在网络带宽紧张时,可配置路由器优先转发该数据包,以保证在该应用网络的服务质量(QoS)
eg :window中设置DSCP值(但要配合设置路由器才能起作用)
iv 总长度即首部+数据之和长度,单位为字节,字段为16位,即最大长度为2^16-1字节,如果IP数据报有分片,则这里的总长度是分片后的单片的数据和首部长度和
v标识占16位,IP软件每产生一个数据报就产生一个标识字段,当分片时,该标识字段会被分给所有数据报片,相同标识字段的值分片后就能够重新组装
vi 标志 占3位 只有低两位有意义,最低位=1则表示后面还有分片,=0则表示该分片为最后一个,中间位=1表示不能分片 中间位=0表示允许分片
vii 片偏移 分片的数据报中,该片的数据起始量相对于用户数据字起点的偏移量,以8字节为偏移单位,即每个分片长度一定是8字节的整数倍
vii 生存时间TTL,占8位 现在叫跳数限制,现在不是一个时间概念而是次数概念,路由器每转发一次就将TTL-1,最大是255,即最多能经过255次转发,当减少到0时,则丢弃,如:设置TTL为1,消息只能在局域网传播,因为一旦路由器转发,TTL就会=0,然后丢弃
viii 协议 占8位,表明数据部分是使用何种协议
常用协议字段值
x 首部检验和 占16位,对首部每次经过路由后由于首部发生变化,都要进行一个检验和计算
xi 源地址 32位 ,目标地址32位
抓包分析IP协议
wireshark抓包数据分片:
ping设置不可分包,但如果超过1500b,则无法发送
6.tracert路由跟踪结果详解
7.IP多播
(1)计算机通信分一对一通信,组播通信和广播同喜,一对一多个计算机时,需要将一份数据发送多分,如A为组播机器,BCD订阅A,采用一对一则A的带宽必须很大 ,而组播是给A直接往某个D类组播ip发数据,只发一份,然后给BCD网卡绑定相应的组播地址即可
(2)组播分两种,一种是本局域网上硬件组播,一种是互联网上组播,硬件组播需要将组播数据包使用组播mac封装
(3)组播mac地址
组播mac地址区间为: 01-00-5E-00-00-00 到 01-00-5E-7F-FF-FF,组播地址高25位固定,而低23位直接与IP多播地址低23位映射,但是映射并非1-1对应,可能两个ip低23位一样,但高位不同,因此接收到数据时,还要根据ip是否一样判断是否接受组播包
查看本地组播地址
8CIDR 无分类IP编址,斜线记法,在ip地址后面加上斜线/,然后写上网络前缀所占位数
eg: 128.14.35.7/20 即前20位是网络号,后12位表示的是主机号,
掩码是1111…1000…0 20个1,然后12个0
arp广播包太多造成网络拥堵
9.动态路由协议 :RIP
动态路由就是动态配置路由的协议,路由表信息通过相互连接的路由器交换信息然后进行算法优化,包括以下功能:知道相邻路由器,知道网络中有哪些网段,知道到某个网段的所有路径,并选出最佳路径,定期更新路由信息
(1)最佳路径判断标准是跳数,最大15跳,超过15跳则认为不可达
(2)路由器需要30s定期发出自己的路由信息,180s还没有发出时,会被周围路由器判断为不可达
解释: A上维护着网段10.0的信息和跳数,跳数为0,即直连,那发到路由器A上的信息会直接给10.0网络,30s后交换路由信息,B就知道10.0的网段得通过下一跳A(距离为1)才能到达,30s后c也会从b那里知道10.0的下一跳应该到B,与目标距离为2,当然A-C也能通过E和D,但是跳数不是最少,因此不用,除非最优路线上不可达
(3)如果没有RIP,而是将互联网中所有的拓扑信息存在路由器中,那存储空间巨大,做路径选择也会非常消耗cpu,非常慢,因此目前路由器中只有对应网段的下一条路由的地址
(4)每个报文头中目的地ip永远是目标ip地址,但是mac地址 却会不断变化,永远指向下一跳的机器
10 linux中查看和修改路由表,在一个局域网中要与外界不同网段通信时,需要至少一个网关,route命令可以查看配置当前机器的网关
eg: route -n
结果解释:
如ping 百度,161.135.169.121 ,与本网段不同则直接走网关,三个网关,最后一个由于通过掩码和百度ip的计算,得到的网络号就是0.0.0.0,因此会判定与百度网段通信要通过最后一个网关
五、运输层
1.运输层只有主机的协议栈才有,而路由器在转发中只有下三层;网络层提供的是主机间的逻辑通信,而运输层则为应用进程提供端到端的逻辑通信
2.UDP特点:
无连接 不需要建立连接也不需要释放
不可靠交付
UDP面向报文,即应用程序交付的报文,udo添加自己的首部之后就直接交付给IP层,因此应用层应该选择合适的报文大小,避免IP分片
UDP没有拥塞控制,网络拥塞时不会降低源主机发送频率
UDP支持一对一,一对多,多对一和多对多;首部开销少
3 UDP首部格式
udp只有两个字段,数据字段和首部字段,首部字段共8字节:
源端口,不需要对方回复时可全0、目标端口、长度最小为8和检验和
3.传输层和应用层之间使用端口号建立联系
4.TCP传输控制协议特点
面向连接,点对点,全双工(两端都有缓存,临时存放数据,应用吧数据交给tcp就可做自己的事)、面向字节流(流是字节序列,发送方和接收方的数据块数量不同,但字节流完全一样的),TCP每次发送的长度由网络拥挤和对方的窗口值控制,而UDP完全由上层应用控制
5.TCP中涉及到的相关协议
(1)停止等待协议,每发完一个分组就停止等待对方确认,确认后再发下一个分组,其中的机制有:超时重传,分组副本保存用于超时重传,超时计时器(比平均往返时间长一些)的设定,分组编号(知道确认消息是对哪个分组的确认),以上可靠传输协议称之为自动重传请求ARQ,即重传的请求是自动进行的(通过超时重传机制)
(2)停止等待协议信道利用率太低,一个接着一个发送,一般采用流水线传输,即可连续发送多个分组,而非等对方确认再发送
(3)连续ARQ协议
接收方采用累积确认,即受到几个分组后对按顺序到达的最后一个分组确认,优点是实现方便,缺点是5个分组中间第3个丢失的话,只能3-5都重传
6.TCP报文段首部格式
(1)源端口和目标端口 各占2字节
(2)序号,4字节,范围[0,2^32-1]增加到最大后又重置为0,该字段表示本报文段所发送的数据的第一个字节的序号,字节流中的每个字节都按顺序编号了
(3)确认号 4字节,期望下次收到的报文段的第一个字节序号,2^32个字节大概4gb,一般来说当重复使用时能够保证旧数据已经到达终点了
(4)数据偏移 占4位bit,tcp报文数据段起始位置到整个报文起始位置的偏移量,即tcp首部的长度,单位是32位字(4字节),4个bit最大15,即tcp首部长度最大60字,可变动长度最多40字节
(5)保留 6位bit,目前为0
(6)6个控制位 URG=1表示紧急报文,比如ctrl+c,需要插队到本段报文的最前面;确认ACK=1时,之前的确认号才有效,在连接建立后传输的所有数据都应该ACK=1;PUSH=1很少用;RST复位表明tcp连接出现严重差错,必须释放连接并重建连接;SYN同步序号,SYN=1且ACK=0时表明是请求建立连接的报文段,对方回复ACK=1且SYN=1,因此SYN=1就表示连接请求或者连接接收;FIN终止,FIN=1表示发送方数据已发送完毕等待释放
(7)窗口值 2字节,窗口值是接收方窗口,告诉发送方:从本报文首部算起,能够接收的数据量(字节),因为接收方的缓存空间有限,窗口值是发送方设置自身发送窗口的依据,变动值
(8)检验和
(9)紧急指针,占2字节,当URG=1时有意义,指出紧急数据的末尾在报文段中的位置,从报文数据开头开始处理到该位置后就会恢复正常操作,窗口为0也可发送紧急数据
(10)选项 可变长度最大40字节 ,包括不限于以下字段:
MSS最大报文段长度(数据字段的最大长度),MSS太大,IP容易分片,MSS太小网络利用率不高(IP头+TCP头>=40字节),连接建立的双方都把自己支持的合理的MSS写入该字段,后续发送就按此发送,做数据分包,默认536
窗口扩大选项,占3字节当吞吐量要求高时,可设置该字段来增大窗口值;
时间戳字段 占10字节,主要字段为时间戳值(4字节)和回送回答(4字节),作用一、发送方发送时塞进去时间戳,接收方回复时将时间戳复制放到回送回答位,发送方可计算RTT,作用二、序号重复时可通过时间戳判别是新数据包还是旧数据包
7.TCP可靠传输的实现(在连接建立后主要是靠超时重传机制,但是这里面又通过滑动窗口来确定重传哪些)
(1)以字节为单位的滑动窗口,由接收方给的确认号和窗口大小确定下次发送的字节,接收方每次给出两个值之后,发送方就调整自己下次发送的序列号和发送的字节数
(2)窗口和缓存的关系
发送缓存存放准备发送的TCP数据和已经发送但是未确认的数据(用于超时重传),发送窗口通常是发送缓存的一部分,两者后沿重合,写入发送缓存不能太快,容易满;
接收缓存存放按顺序到达但未被读取的数据和未按序到达的数据,读取速度慢的话,窗口值就会相应减小,反之增大,但不会大于缓存大小
TCP要求接收方要有累积确认的功能,可减少传输开销,但是不应该过分推迟,否则会导致超时重传,TCP规定推迟时间<0.5s,全双工通道很少有同时两个方互发的
8 TCP流量控制,通过滑动窗口来进行流量控制
TCP窗口单位是字节,不是报文段
9.TCP拥塞控制方法
算法有四种,慢开始,拥塞避免,快重传和快恢复;
发送方维持一个拥塞窗口,大小取决于网络的拥塞程度,只要出现拥塞就将窗口减小一些,否则增大一些,发送方的发送窗口=拥塞窗口,判断拥塞的依据就是出现了超时
慢开始的思路是:刚开始并不清楚网络的拥堵情况,因此由小到达发送拥塞窗口,直到拥塞窗口=慢开始门限,
然后使用拥塞避免,当出现超时时判断为网络拥堵,则将新的门限值调整为原来的1/2
ps:综上 发送窗口上限值=Min[拥塞窗口,接收窗口]
10 TCP的连接建立
A开始向B发送连接请求,SYN=1,同时初始化序号seq=x,SYN=1的请求连接报文不携带数据但是要消耗一个序号,然后A进入SYN-SENT状态,等待B确认
B可建立连接,发送确认ACK=SYN=1,然后确认号ack=x=1,自己初始化序号为seq=y,然后B服务端进入SYN-RCVD状态;
A进程收到B确认后,对B的确认进行确认,ACK=1 ack=y+1,自己序号seq=x+1,然后双方都进入ESTABLISHED状态
ps:A之所以要给出最后一次确认,是因为防止已经失效的连接请求再次到达B,B以为是新的连接请求,于是发出确认,如果两报文握手,则B会浪费很多资源,而三次握手的话,由于A没有发出连接请求,当B给出确认时,A不理会该确认,这样无用连接就不会建立
抓包看连接建立
11.TCP连接释放
通信结束之前双方都是established状态,A发出FIN=1,seq=u,u为最后一个数据序号+1,然后A进入FIN-WAIT-1状态,FIN报文无数据,但是消耗1个序号;B随后发出确认,ACK=1 ack=u+1,seq=v,然后B进入CLOSE-WAIT,此时为半关闭状态,A不发送数据,只接收B剩余的发送数据,A收到确认则进入FIN-WAIT-2阶段,等待B发出FIN=1的释放报文;
B若无发送数据,则应用进程就通知TCP释放连接,B发出FIN=1,ACK=1 ack=u+1(跟上次一样),seq=w,然后B进入LAST-ACK(最后确认状态);
A收到B的释放报文后必须发确认ACK=1,ack=w+1,seq=u+1,然后A进入TIME-WAIT状态,Bclose掉**,而A 需要等待2个最长报文寿命(MSL)才closed,防止B的FIN=1释放报文超时重传**
ps:TIME_WAIT和CLOSE_WAIT由主动发起断开请求和被动接收方决定,而并非client或者server特有,如http短连接场景下,客户端请求完后,服务端会主动关闭连接,那如果高并发的短连接多的话 TIME_WAITE会大量出现在server端,总之TIME_WAIT是发生在主动关闭一方的,而close_wait相反
ps:TCP的半连接队列和全连接队列,处于SYN_RCVD的放入半连接队列,处于ESTEBLISHED放入全队列
参考:https://www.cnblogs.com/jiagoujishu/p/13681429.html
常用的三个状态是:ESTABLISHED 表示正在通信,TIME_WAIT 表示主动关闭,CLOSE_WAIT 表示被动关闭 大量出现close_wait说明服务端应用有问题,而TIME_WAIT出现说明本机是客户端,正在经历MSL后关闭,MSL查看:
cat /proc/sys/net/ipv4/tcp_fin_timeout
大量close_wait出现,有一种情况是,客户端不想等了(eg:5s超时)而服务端却还在进行比较耗时的操作,比如rmi等,此客户端主动发起断开fin=1,服务端就会卡在CLOSE_WAITE
http://t.zoukankan.com/grey-wolf-p-10936657.html
保活计时器:服务端设置保活计时器,解决的已建立连接,但是客户端出现故障如断网断电,则服务端无法感知客户端的状态,设置2个小时的及时,2小时后没收到则服务端发探测报文,以后每隔75s发送一个报文,10次仍无响应,则认为客户端出出故障,关闭该连接,一般实践中为保证此种情况能够及时感应到,客户端和服务端都会相互发送心跳包
查询linux上设置的保活计时器,即多久无通信就关闭的时间
sysctl -a |grep keepalive
net.ipv4.tcp_keepalive_intvl = 75
net.ipv4.tcp_keepalive_probes = 9
net.ipv4.tcp_keepalive_time = 1800 //这个参数 单位s
ps:与tcp/ipv4相关的参数都在以下路径下:
/proc/sys/net/ipv4
12.连接是通过软件层面而非物理层面通过按照协议的数据交换而形成的一种抽象的通道
tcp的字节流意味着, socket数据无头无尾,从中间任意位置起 如果不加协议头,无法知道数据流的确切位置,因为tcp协议都有协议头
13 linux中使用tcpdump命令可进行抓包,类似于wiresharke
tcpdump -iany -Xn -s0 dst host 10.207.8.23
抓目的地ip为xxx23的请求,-X打印-n不将ip解析为域名, -s0表示打印所有内容
tcpdump src port 8088 端口过滤
参考大全和示例:
https://blog.csdn.net/weixin_36338224/article/details/107035214
六 应用层
ps:应用层拆分数据的原因:
链路层有MTU 1500字节的限制;拆成多包后可复用多个传输线路,并行发送
1.主要协议有:DNS 、HTTP、DHCP SMTP和POP3邮件协议等
2.DNS域名解析系统
(1)DNS规定域名标号(即每一级的域名)不超过63个字符,多级不超过255个字符,也不区分大小写字母
三级域名.二级域名.顶级域名
(2)顶级域名三大类:
国家顶级域名 eg:cn us uk等
通用顶级域名:com(公司) net(网络机构) gov(政府)等
基础结构域名 arpa,用于反向域名解析
(3)域名服务器
i.以区划分管辖范围,区内所有节点都能联通;区是域的子集;
一般的树状结构的DNS服务器
ii.域名服务器类型:
根域名服务器,知道所有顶级域名服务器域名和IP,本地域名服务器解析域名时,如果自身无法解析就首先求助根域名服务器,A-M分别表示不同的根域名服务器组
顶级域名服务器:负责在该顶级
域名服务器下注册的所有二级域名,给出DNS查询结果,可能是应答,也可能是下一步应找到的IP地址
权限域名服务器:负责一个区的域名服务器,当权限域名服务器不能给出客户端答复时,就会告诉客户端下次该请求哪个权限域名服务器
本地域名服务器也叫默认域名服务器,一般都距离比较近,起到一个缓存作用
iii.DNS查询的两种方式:迭代查询和递归查询,主机向本地域名服务器查询一般都是递归查询,主机查本地DNS,然后本地DNS代替主机去请求根域名服务器;本地域名服务器请求根域名服务器一般都是迭代查询,根域名server告诉本地域名server下一步应该去查找哪个服务器,然后本地域名服务器又去查找
上图中Client得到了最终的解析结果,但是Clinet不知道B是如何查找的,对它来说可以使用N来解析全球的域名
iv.除了多级域名服务器以外,一般在主机和本地域名服务器中都会有高速缓存
(4)一个域名可以配置多个主机,但域名全球唯一,主机名+域名全球唯一,主机名和物理服务器并没有一一对应关系,而是一个应用或者一个服务一个主机名,比如blog和mail是一个服务器,但是可以有两个主机名
(5)查看本机域名缓存的解析结果
ipconfig /displaydns ipconfig /flushdns 清空dns缓存
(6)域名解析的记录类型: A(address)记录指定主机名(或者域名)对应的IP地址记录、
CNAME 别名执行 可设置主机abcde.com的别名为a.com,则可用a.com来代替abcde.com访问了 、MX记录(邮件交换记录) 、NS名称服务器
(7)非权威应道和权威应答:非权威即请求到的IP不是客户端首选或者备选的DNS服务器给出的,而是请求的其他层级的域名服务器,而权威应答则是配置的服务器给的答案
(8)通过nslookup命令能够交互式的获得域名解析结果,同时看到一个域名确实能够配置好几个物理服务器
⦁ (9)DNS协议格式
⦁ i 参考:https://blog.csdn.net/marywang56/article/details/77932414
⦁ ii 查询问题区域由查询名和查询类型以及查询类组成,查询类型取值有:A(1)期望获得查询名的IP地址,CNAME (5) 规范名称。
⦁ PTR (12) 指针记录。 HINFO (13) 主机信息。 MX (15) 邮件交换记录。 AXFR (252) 对区域转换的请求。 ANY (255) 对所有记录的请求。
⦁ 查询类 2字节 表示查询的协议类 IN(1)表示互联网地址
⦁ iii.抓包:
⦁ iv.window展示本机dns缓存解析结果
⦁ eg: ipconfig /displaydns,
⦁ ipconfig/ flushdns 清除缓存
互联网中的域名注册商的原理:
注册局
每个域名的tld由一家注册局来负责运营,如.com类域名由Verisign负责,.cn域名由CNNIC负责。注册局接收注册商的请求来管理domain、contact和host
注册商
接收最终用户的请求,并向注册局注册和管理域名。我们注册域名,一直是向注册商注册,注册商有系统与注册局通信。
3.DHCP配置协议
(1)DHCP租约
解决的问题是:计算机临时接入网络向DHCP服务器请求了一个ip,但是随后直接走了,比如拔掉网线并未向DHCP服务器发送释放的请求,这样DHCP服务器就会无法回收IP,因此给一个客户端租约,租约到期如果没有更新,服务器会直接单方面废除租约,收回IP地址,因此还在使用的客户端需要在租约到期前更新租约
(2)DHCP租约生成过程
i DHCP DISCOVER 客户端发送广播信息,寻找局域网中的DHCP服务端
ii.DHCP OFFER 服务器从ip池中挑选一个ip地址以广播的形式传送给DHCP客户端,使用广播是因为此时客户端还没有ip地址,只能以局域网广播形式通知mac地址,若有多台dhcp 服务器,那么都会响应客户端,然后客户端挑选第一个回复的一个dhcp 服务器
iii DHCP REQUEST 当客户端挑选好后,广播响应一个request信息给服务端,此外,还通知其他dhcp服务器,以便这些服务器将原本要分配的ip回收
iv DHCPACK,服务器发送ack确认信息,此信息包含客户端需要的默认网关、DNS服务器配置等
(3)DHCP地址租约更新
租约过期之前,DHCP客户端向服务器周期性续租,如果过期而未续租,则失去地址重新开始一个 租约生成过程
(4)DHCP客户端如果无法得到新的ip地址,会给自己产生一个169.254.0.0/16网段中的地址作为临时地址
10 Tlenet协议 C-S架构
(1)Telnet是简单的远程终端协议,Telnet允许用户用TCP连接(登陆)到远程另一个主机,然后可以将用户的 传到远端,然后返回远端到屏幕,也叫终端仿真协议
(2)格式:所有通信都是用1个字节,7位做ACSII码传输数据(指令),最高位置为1时做控制命令
(3)使用telnet连接linux并操作
参考: https://www.cnblogs.com/qichunlin/p/12318774.html
安装:
yum -y install xinetd 安装管理telnet服务
yum -y install telnet-server 安装telnet服务端
yum -y install telnet 安装telnet客户端
启动:
systemctl start telnet.socket
systemctl enable telnet.socket
systemctl status telnet.socket
使用 在dos中:
telnet ip port(默认23)
等待远程返回提示登陆
连接linux的操作返回页面
root用户登陆提示密码不对的原因和解决:
https://www.pianshen.com/article/5577642181/
一般是因为系统做了安全限制,限制root用户登陆的协议来源
查看 /var/log/secure日志,将限制的协议如 pts3加到/etc/securetty中
windows一般自带telnet客户端,如果没有该命令,则要开启该服务
ps:其实telnet server并非一定要有,telnet命令是和服务端建立了一个socket连接而已,只要按照 服务端要求发送数据,就能够得到响应 如:telnet www.baidu.com
11 HTTP的两种作业方式:
(1)流水线作业和非流水线作业,非流水线方式:在一个socket连接中,http请求前一个得到相应才能继续发下一个,而流水线则是可以在建立连接后, 发出http请求,不用等待前一个响应,
(2)流水线作业中服务端必须按接收请求的顺序进行响应
(3)服务器必须保证将请求和响应做对应
(4)HTTPS是面向文本的,因此在报文中字段都是ASCII码,然后传输时传输文本对应的16进制数字
(5)HTTP1.0和HTTP1.1主要区别
i.长连接,1.0的短链接缺点在于 每次都要建立tcp链接和断开,同时,每次请求都要经过2RTT(见图,在握手前两步完成后,最后一个确认是跟着内容一起走的)
ii.HTTP1.1提供两种作业方式
流水线式和非流水线式,HTTP1.1节省了tcp建立的过程,但是非流水线每个访问都要一个RTT,一般都采用流水线式,多个请求一起发出,一个RTT可以多个请求,节约了总体访问时间
(6)http协议格式
eg:
nc www.baidu.com 80
相当于和百度建立了一条tcp连接,然后 HTTP协议向百度80端口发送数据就能够收到百度响应
然后 输入 GET /zsx HTTP/1.1 +两次回车,第一次是协议要求,第二次表示发送
可尝试用nc请求以下dns
(7) http1/1 event-stream
media-type = text/event-stream
if server response is generated and we have to wait for a while
- we can consider the media type event-stream(sse server push)
*its an extension of http1.1 and is different with http2.0
if server response is generated and we have to wait for a while
- we can consider the media type event-stream(sse server push)
its an extension of http1.1 and is different with http2.0
* The event stream consists of a series of events, each separated by a blank line (\n\n).
* Each event within the stream consists of one or more lines.
* Commonly used field names include event, data, id, and retry
* client can process deffirent kind of event
The connection persists until either the client or the server explicitly closes it
(8*)http2**
流式http2.0 协议 特性等详解
binary 、multiplex、server push 、https、HPACK、FLOW CONTROL
- 万维网 www(World Wide Web)是个大规模联机的信息存储所,即web,使用链接的方法可以从一个网站跳跃到另一个
13 网络安全问题
⦁ (1)两大类安全威胁 被动攻击和主动攻击;被动攻击即截取,只截取内容,不干扰信息流
⦁ (2)主动攻击 :篡改 ,恶意程序,和拒绝服务(如高并发发送分组,导致无服务器无法提供服务)
⦁ (3)数据加密模型
⦁ 明文---->加密—>密文传输---->解密—>明文
⦁ (4)两类密码体制
⦁ 对称秘钥密码体制,加密密钥和解密密钥是相同的密码体制,现在常用的是三重数据加密标准DES
⦁ 公钥密码体制(非对称密码体制)
⦁ 使用不同的加密秘钥(公钥)和解密秘钥(私钥),公钥匙公开的,解决的问题是对称密钥体制中的密钥分配问题,加密过程:
⦁ 公钥和私钥由密钥对产生器成对产生
⦁ (5)鉴别和加密不相同,别是要通过验证通信中的对方是自己要通信的对象,并且报文是完成的 没有被篡改过
⦁ i.密码散列函数
⦁ 散列函数的特点:输入长度可很长,但输出相对固定,不同的散列值对应不同输入,但是不同输入可能对应相同散列值,同时密码散列函数最重要的特征为它是一种单向函数
⦁ ii.常用的的密码散列函数MD5和SHA-1(2/3),md5虽然不可逆推,但是确实能够造出两个内容不同但是md5值一样的报文,SHA相对更安全一些 md5在公网环境下不应再被用于文件完整性校验
⦁ PS:MD5和SHA是校验文件的,不是加密的,而是一种hash算法函数
⦁ (6)HTTPS的原理:
⦁ 参考:https://www.ruanyifeng.com/blog/2014/02/ssl_tls.html
1)握手阶段的说明
i.整个握手阶段是明文
ii.整个握手阶段生成3个随机数,前两个明文,最后一个需要私钥和公钥加解密
iii.最后拼接成的会话密钥不再进行传输,而是客户端和服务端都进行保存,整个通话的安全,只取决于第三个随机数(Premaster secret)能不能被破解。
iv.三个随机数是为了更随机一些
2)证书
i.服务器的公钥如果直接响应下发给客户端,客户端无法知道该公钥是否是对应的服务端的,公钥有可能是代理机器的,因此需要CA对该公钥进行担保
ii.服务器会提前将自己的公钥提交给知名CA,CA进行一系列资质认证后对明文公钥使用自己的私钥进行加密并下发证书(包括了加密后的公钥)给服务器
iii. 同时客户端计算机无论什么型号都内置了很多知名CA的证书(CA的公钥)
iv.服务器在上图2的response中将自己的证书给客户端,客户端会在自己的计算机中找对应的证书CA公钥进行解密并认证
v.一个服务器的CA证书只对一个公钥进行认证,以上对CA的过程是证书申请就完成的,https阶段不涉及
3)数字签名=加密(私钥,hash(内容)),主要用于判断内容是否被篡改过
CA证书中的签名作用是对服务器公钥进行的签名,防止公钥被篡改
参考:https://www.cnblogs.com/jhj117/p/5601590.html
4)https的安全是基于对CA的信任,如果CA本身胡乱背书服务器,那就不是技术能解决的了
5).jdk中进行https请求为什么需要用Keystore加载证书?
如果是用浏览器访问https资源,发现证书不可信任,一般会弹框告诉用户,对方的证书不可信任,是否继续之类。Java虚拟机并不直接使用操作系统的keyring,而是有自己的security manager。与操作系统类似,jdk的security manager默认有一堆的根证书信任,keystore加载的证书其实就是相当于在JVM内置证书
6) 证书是针对域名颁发的,域名校验不上也会显示不安全的标识
14 nc是个网络连接工具,能够创建TCP/UDP/SSL等很多连接
eg:
nc www.baidu.com 80
相当于和百度建立了一条tcp连接,然后 HTTP协议向百度80端口发送数据就能够收到百度响应
然后 输入 GET / HTTP/1.1 +两次回车,第一次是协议要求,第二次表示发送
可尝试用nc请求以下dns
14.tcp中的几个常用参数解释:
backlog:即backlog用来修改全连接队列的大小
在linux系统内核中维护了两个队列:syns queue和accept queue,前者用于保存半连接状态的请求(server段连接状态为SYN_REV),其大小通过/proc/sys/net/ipv4/tcp_max_syn_backlog指定,一般默认值是512,不过这个设置有效的前提是系统的syncookies功能被禁用;
后者用于保存全连接状态的请求(server端状态ESTIBLISHED),其大小通过/proc/sys/net/core/somaxconn指定,在使用listen函数时,内核会根据传入的backlog参数与系统参数somaxconn,取二者的较小值
SO_RCVBUF: 接收缓冲区大小,当消息发送过快而接收端应用程序来不及处理时,数据就会缓冲在内核的缓冲区中,当缓冲区满了再接收的数据就会直接丢掉,丢掉数据后回复的ack还是上一次的,因此丢掉的数据会重新发送
keepalive tcp的保活机制,即在连接建立后,很久双方都没有发送数据,这时候网络有可能异常,一方也有可能断电关机等,但是另一端并不知道,因此会将该连接一直持有,长时间会存在大量无用连接,因此保活开启后,每隔一段时间(该时间linux设置,一般30min)就会发送心跳包,多次发送都没回应则认为该连接异常,就会断开,但是一般应用层应该有自己的保活心跳机制
- TCP_NODELAY和Nagle算法
TCP/IP协议中,解决数据部分很小,而协议头占比很大,Nagle算法就是为了尽可能发送大块数据,而对数据做一定的延迟发送,避免网络中充斥着许多小数据块。
Nagle算法的基本定义是任意时刻,最多只能有一个未被确认的小段。 所谓“小段”,指的是小于MSS尺寸的数据块,所谓“未被确认”,是指一个数据块发送出去后,没有收到对方发送的ACK确认该数据已收到。
Nagle算法的规则(可参考tcp_output.c文件里tcp_nagle_check函数注释):
(1)如果包长度达到MSS,则允许发送;
(2)如果该包含有FIN,则允许发送;
(3)设置了TCP_NODELAY选项,则允许发送;
(4)未设置TCP_CORK选项时,若所有发出去的小数据包(包长度小于MSS)均被确认,则允许发送;
(5)上述条件都未满足,但发生了超时(一般为200ms),则立即发送。
除此之外的tcp数据都暂时缓存下来,等待触发条件后再发送
延迟确认
还有一个TCP确认延迟机制 。当Server端收到数据之后,它并不会马上向client端发送ACK,而是会将ACK的发送延迟一段时间,多个ACK最后只发送一个最大的ACK,比如4次挥手时,被动断开连接方如果直接没有数据发送的话,那么4次就会变3次挥手
16.csrf攻击,跨站请求伪造攻击
(1)原理
(2)cookie不能跨域访问,为什么还会存在csrf 跨站请求伪造?
第5步,浏览器对每个域名的访问都会自动携带上该域名下的cookie,这与跨域访问无关,在第4步,B将伪造的url给了C,而不是B自己访问,如果是B自己,则算是跨域,参考:https://ask.csdn.net/questions/643226
(3)防御csrf: 常用token校验,服务端给客户端token,客户端js代码将token做两个操作,1)保存token到cookie;2)每次表单提交时都提交该token,然后服务端取cookie中的token以及表单中的token进行匹配;或者表达中token在服务端保存,然后进行匹配,就不用再使用cookie;如果是恶意网站给的link,点击时只会携带上cookie中的token,而表单中是没有该token的(毕竟只是一个连接)服务端token校验不通过
17.xss跨站脚本攻击
(1)原理图
(2)防御
最好前端对所有的文本都做合适的转换,这样浏览器就会将文本仅仅作为文本展示,而不是脚本执行,如直接使用write将所有文本都输出:
document.write('url: <a href="' + url + '">"' + url + '"</a>');
参考
https://www.cnblogs.com/tugenhua0707/p/10909284.html
- websocket 通信协议模板
19 connectionTimeOut vs readTimeOut
connectionTimeOut focus on the handshake process,that means handshake should finish within connectionTimeOut time ,or SocketTimeOutException will be thrown out
if there is no program responsing the request at all, then this config will not work, and a ConnectionException(Connect refused) will be thrown out promptly;
readTimeOut focus on the read process which is of course after connection has been done