目录
网络概述:
网络通信其实就是位于网络中不同主机上面的2个进程之间的通信。
1.网络通信的层次
(1)硬件部分:网卡
(2)操作系统底层:网卡驱动
(3)操作系统API:socket接口
(4)应用层:低级(直接基于socket接口编程)
(5)应用层:高级(基于网络通信应用框架库)
(6)应用层:更高级(http、网络控件等)
2.OSI七层网络模型
3.TCP五层模型:
表示层:解决不同主机的通信的数据格式问题
会话层:建立和管理应用程序之间的通信(连接)(对下层的封装) 方便用户使用,自动收发包 报文
传输层:拆包组包 TCP:保证数据包的完整性 和 以及处理传输过程中可能发生的危险 UDP:发完就完了 报文----拆分成---->包
网络层:路由和地址解析。选择适当的网络节点进行路由。 包 ---->数据帧
数据链路层:控制对物理设备的访问 规定数据如何在不同物理设备上进行传出 并提供数据纠错功能。在不可靠的物理设备上提供可靠传输 数据数据帧
物理层:定义通信的物理设备的规格。网线接口类型,光纤接口类型,传输速率等
因为Socket通信时候用到了IP和端口,仅这两个就表明了它用到了网络层和传输层;而且它无视多台电脑通信的系统差别,所以它涉及了表示层;一般Socket都是基于一个应用程序的,所以会涉及到会话层和应用层。
参考博客:
https://www.cnblogs.com/carlos-mm/p/6297197.html
https://blog.csdn.net/u011774517/article/details/67631439
一、物理层
1.物理层作用
管理维护物理连接,确定传输媒体特性,提供比特流传输服务,对上层(数据链路层)屏蔽物理设备以及协议的差异性。 信息转 信号
2.物理层概述
信道:传输媒介
信息(“aasdf”)-------->数据(二进制数据)----------->信号(可在物理设备上传输)
计算机产生的二进制数(基带信号)无法直接在信道上传输,通过调制将基带信号转换成可在信道上传输的信号。
3.信号调制
基带调制:将基带信号转换成符合信道特性的基带信号,也称作编码
限制码元传输速率的两个因素是信噪比和带宽(信道能通过的频率范围)
当带宽一定,信噪比一定,码元传输速率一定时,可让码元携带更多的数据来提升传输速率(一个码元表示一位二级制数据 --->一个码元表示m位二级制数据)
4.信道复用技术
码分复用:扩频,将1比特转化成一个比特序列,多用于加密
二、数据链路层
1.数据链路层作用
在物理层比特流在介质上传输是不可靠的,数据链路层在物理层的基础上提供差错检测,差错控制,流量控制。为网络层提供一个可靠传输。对网络层屏蔽了不同传输介质的差异性。
数据链路层信道通信方式:点对点通信 广播通信(广播通信需要共享信道协议来协调主机间的数据发送)
2.点对点数据链路层三个基本问题
在网络ip报文的基础上添加首尾封装成帧,首尾是为了确定帧界限,也包含了一些控制信息 帧 = 首 + ip收据报 + 尾。
作用:根据帧定界符 可以确定是否收到的是个完整帧 不是完整帧直接丢弃
保证ip数据报中的比特组合不会出现帧定界符,使用字节填充和字符填充将ip数据包中的帧定界符的字节进行转义
链路上传输由于噪声的干扰导致传输的帧数据错误,数据链路层采用循环冗余检测CRC,保证帧的正确性
循环冗余检测CRC:通信双方约定一个比特序列,将待发送数据与约定比特序列进行运算,生成一个帧检测序列FCS,将FCS添加到数据后一起发送出去。接受端根据FCS校验是否数据出错,出错就丢弃(并不能判断出是哪些字段出错)
CRC保证了比特流的正确性,但并不是一个可靠传输,还存在丢帧,帧重复,帧乱序到达等情况,所以再次基础上增加帧序号,确认,重传机制保证链路层为网络层提供一个可靠的传输。
3.滑动窗口协议
流量控制:平衡收发方传输/接受速率 流量控制取决于接收端 防止接收端缓冲区溢出(丢包)
当发送速率 > 接受速率 接收端的缓冲区可能会溢出 导致丢包
若从滑动窗口的观点来统一看待停等、后退n及选择重传三种协议,它们的差别仅在于各自窗口尺寸的大小不同而已。
后退n协议:发送窗口>1,接收窗口=1; 每收到一个帧并且帧序号在窗口内 则回一个确认帧
选择重传协议:发送窗口>1,接受窗口>1; 窗口内的帧全部收到 则发送确认帧 并移动窗口
发送窗口大小是根据一段给定时间内链路上有多少待确认的帧来选择的
不支持:流量控制 纠错(纠正比特流错误) 多点通信 半或单双工链路
LCP为链路控制协议用于链路层的建立,删除,监控等。如协商MTU(数据最大长度,不是帧长度)
NCP为网络控制协议,常用IPCP,IPXCP。用于协商网络层配置的协议,主要有协商通信的逻辑地址IP是否可用等。
5.以太网
1.无连接 无编号 无确认 无重传 所有的可靠性都是上层TCP决定
总线型本质就是广播通信,所以一对一通信只是对mac地址进行校验,对不是发往本机的帧进行丢弃
总线型网络:主机发送数据,总线上的所有主机都可收到数据,进行地址对比,如果不是发给自己的就丢弃,是则接收处理。由于信道是共享的,多台主机’同时‘发送数据,则信号会被破坏掉。
发送前 :在发送数据前检测是否有其他主机正在发送数据(根据电路上电压的变化) 若在一段时间内信道是空闲的 则发送数据
发送数据后:等待一个争用期时间(总线上最长的两个端点传输时间 * 2),如果在这段时间内没有检测到碰撞,则认为发送成功,如果检测到碰撞,随机一个时间进行重新传输(防止再次同时传输发生碰撞)
MAC子层的主要功能包括 数据帧的封装/卸装,帧的寻址 链路的管理,帧的差错控制等。MAC子层的存在屏蔽了不同物理链路种类的差异性
由于MAC帧是针对局域网所以需要 目标于源地址,PPP协议是点对点的连接不需要地址信息。数据字段最小是46字节,不足补齐
前八个字节不属于mac帧 是额外信息 前七个自己用于两边的网卡进行同步,第八个字节是定界符通知网卡要有MAC帧来了
局域网帧与帧之间有时间间隙,所以不需要结束定界符 也就不需要透明传输
集线器:数据转发 并不缓存数据 将信号放大转发 减少因为信号在物理媒介传输时信号衰减 导致帧无法解析
用内部器件模拟电缆实际还是总线型 CSMA 工作在主机的网卡上
网桥:分割了冲突域,具有数据过滤功能,两个端口,每个端口是一个冲突域
缓存数据(AB同时向C发送数据 C只能同时接收一个 则不能立刻接收的由交换机缓存)
地址表(哪个主机连的哪个端口 MAC地址) 表的每个表项目都有生存周期
三、网络层
1.概述
网络层是无连接,不可靠尽量交付数据包的服务。由主机的运输层负责对进程提供可靠性的服务。这样设计降低了网络设备的复杂度。
2.IP地址
IP是逻辑地址,用于路由寻址。MAC是硬件地址(每台主机或路由唯一)用于数据链路层帧传递的地址
ABC三类地址的主机号全0和全1都保留,主机号全1为子网广播地址,主机号全0为子网网络地址(一个网段中第一个IP地址为网络地址)
子网划分只是对内,对外来说任然是一个网络(对外网络地址还是分类的),局域网内的所有的掩码相同,每个子网内主机数相同。(对一个X类IP地址域,进行等长划分子网)
子网掩码:无论是否划分子网,子网掩码 & IP就能得出网络地址
3.构成超网(无分类编码)
消除分类IP以及子网的概念,IP格式分为两级 网络前缀+主机号
虽然没有子网,但是分配到’CIDR地址块‘后可以进行子网划分,子网的网络前缀要比整个地址块的网络前缀要长
路由聚合:一个地址块可以有多个连续的X类的网络,路由表中使用地址块(网络前缀)来路由,减少了路由条目
最长匹配:查找路由表中可能得到不止一条匹配结果,应选择最长的一条匹配,网络前缀越长,地址块越小,路由查询范围越小
二插线性查询:将唯一的网络前缀,构建一个二差树,数的每条路径都是一个唯一网络前缀
4.IP协议
总长度:数据 + 头部长度 最大 2^16 - 1 = 65535 不能超过MTU
生存时间:可通过路由数的最大值 每经过一次路由 TTL 减 1 直到减到0 丢弃报文 发送ICMP分组通知主机
协议:数据部分使用的协议 TCP UDP ICMP ....
头部校验和:校验头部数据的正确性,与数据字段无关,上层进行数据校验。采用二进制反码取和
- 原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。
- 反码的表示方法是:正数的反码是其本身;负数的反码是在其原码的基础上, 符号位不变,其余各个位取反。
- 补码的表示方法是:正数的补码就是其本身;负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1。 (即在反码的基础上+1)
5.ARP协议
ARP通过网络层使用的IP地址获取到数据链路层使用的MAC地址
每台主机有一张ARP缓存表,保存本局域网中IP到主机/路由的MAC的映射。
超过生存期的表项自动删除。生存期保证其他当主机的MAC地址改变,可以删除表项,重新请求,获得新MAC地址。保证了表的正确性。
当A向B发送数据,若在缓存中找到B的IP那么不需要ARP进行解析,没找到则通过ARP协议进行解析
2.链路层将ARP分组封装成帧,目的MAC地址为“FF-FF-FF-FF-FF-FF”,进行广播
3.当其他主机收到A的ARP请求,查看是否已经有A的MAC地址,没有则存入。B收到则回复我的MAC地址到A(此时帧有目标的MAC地址所以是单播),保存A的MAC地址进缓存表。
路由表中包含:目的网络号,下一跳的IP地址 没有指定完整路径,而是指定下一跳的地址
若路由连接了网络N,路由直接交付给主机(目的IP地址转换MAC地址 封装成帧 交付到目的主机上)
6.ICMP协议
网络控制协议(Internet control message protocol) 网络层协议,提供路由/主机差错或异常报告,提高IP数据报传输成功率
重定向:通知主机/路由 下次发送数据包时的路由,为了选择一个更快捷的路径
ping:测试主机是否可发,ping 是发送ICMP,目的主机收到后回ICMP
Tracert:说去主机间完整路径,源主机发送TTL为1的报文,第一个路由器收到后,TTL减1丢弃报文(生存期到了),回一个ICMP差错报文,这样就可以获取到第1个路由地址,让后源主机再依次发送TTL为 2 3 。。 知道到达目的主机
四、传输层
1.概述
作用:提供端对端的连接和数据传输服务(进程对进程),网络层提供的是主机对主机之间的连接服务
2.UDP概述
对应用程序交付下来的数据报添加UDP包头形成TPDU交付网络层,无网络拥塞控制,所以网络拥堵不会影响其发送速率。
3.TCP详解
面向连接,字节流传输,全双工,可靠传输(确认重传,流量控制,拥塞控制 校验和)
TCP的每次传送报文长度流量窗口大小和网络拥塞清空进行决定。UDP根据上层发送的数据报大小决定。
1. SYN = synchronization 同步。正如我们上文介绍所说,TCP连接的建立必须要就某些问题达成约定,也就是同步信息
2. PSH = push 发送端通知接收端不要因为等待额外数据而让已送达的数据在缓冲区滞留。类似flush()
3. FIN = finish 也就是我们所说的四次挥手。结束的含义
4. ACK = acknowledge 确认报文。你可以简单认为是回执,具体是确认哪一部分的数据,需要结合sequence number
最后一次握手,是为了防止网络中有延迟的无用连接请求达到服务器端,导致服务器错误的分配网络资源
建立和断开连接时的最后一个确认包,都是有风险的,但是没办法发送确认的确认(这样确认包无穷无尽)。所以对于确认包丢失的情况,建立了超时重发机制(一定时间收不到确认重新发送)。
确认和重发机制保证两边发送和接受信息的同步。 可靠性的另一部分就是减少丢包的可能性。
SYN包中seq = ISN,seq增长速度和等于发送字节速度
seq和ISN:ISN是初始序列号 是一个32位的整数,是一个边界值,ISN<=seq <=ISN + sendbyte
四元组的ISN = 老连接的seq + 每4毫秒加1, 这样做可以保证新连接的ISN 一定是大于老连接的seq(发生回环时出现问题)。这样就可以辨别新老连接的数据包。
当在一个高速通道上,seq会发生回环。同一个seq是不同的包。TCP引入时间戳选项,用于解决这种问题。也就是seq+时间戳 作为包与包之间的鉴别。
https://www.zhihu.com/question/49794331/answer/117922450
为了避免IP层分片,MSS = MTU - (TCP + IP首部)(40字节)。仅在建立连接时通知,在连接过程中无法感知MSS的变化。自己的约束,而不是整个链路的约束。
捎带ack:ack包和数据包组成一个包一起发送 。等待超时就单独发ack。
Nagle算法:阻塞等待ack包,收到ack包时,将缓存的所有数据包使用一个包发送。 特点回应快 发送快。但是对于低俗网络,回复慢导致发送慢,会又"卡顿''。
两种方式分别从接收端和发送端入手,压缩报文的数据量,增加报文的传输速率
成块数据流:单向快速传输大块数据。在未收到确认时发送端可以连续发送多个数据包,但是如果发送端发送包数量不加以控制,可能会导致接收端缓冲区溢出。滑动窗口可以有效解决此问题,窗口用于控制发送端发送速率。
发送端:窗口内的数据是 已经发送未确认 + 可发送。当收到一个确认,窗口左边界右移,当收到一个ACK通知接收端缓冲区改变,窗口右边界右移。
接收端:窗口内的数据是 未发送确认 + 可接受。当发送一个确认,窗口左边界右移,当处理完一个包,窗口右边界右移。
带宽时延乘积:把一条信道比作一根水管。带宽就是水管横截面积。时延就是水管的往返长度。
4.TCP可靠性
发送方通过维持一个发送滑动窗口来确保不会发生由于发送方报文发送太快接收方无法及时处理的问题。此时发送方的报文分为四类, 第一类是已经发送并且得到接收方确认的报文,第二类是已经发送但是没有接收到确认的报文,第三类是发送方还没发送,但是滑动窗口还足够巨大,允许被发送的报文, 第四类是还没发送并且窗口已经被占满,不允许发送的报文。 一般来说,滑动窗口的最左端都是介于第一类跟第二类报文的分界线,最右端是第三类跟第四类报文的分界线。
a、停等协议。 滑动窗口的大小为1, 每个发送报文都要等到被确认以后,发送方才继续发送下一个报文。
b、后退n步协议。 该协议下,滑动窗口大于1,发送方可以一直发送报文,但是当接收到接收方发送的三个连续的同一序列号的ACK报文时,说明该序列号的报文是已经丢失的,那么此时重发该丢失报文以及该报文以后的报文(包括那些已经发送的)。
c、选择重传。在后退n步协议当中,如果某个报文丢失。那么将要重新发送这个丢失报文及以后的所有报文(包括已经发送的),选择重传协议不用做此要求,只要重新发送丢失的报文即可。
重传时间选择:通过每次发包 ---- 到---- 收到确认往返时间RRT,动态计算重传时间。
拥塞是整个通信链路,表示整个链路的拥堵情况,拥塞窗口是通信过程中不断的试探出的一个界限值。
滑动窗口是流量控制,所谓流量控制,是端对端的行为。只对发送和接受端的能力进行一个平衡。
ssthresh:动拥塞避免算法的界限值 上次传输最大的未发生拥塞的值。
拥塞严重:分组丢失引起超时。 然后降低cwnd使网络能恢复到顺畅的情况。cwnd降低到1。
拥塞不严重:连续发送的数据包中某一个丢失,发送端收到多个重复的确认包。cwnd降低为原值一半。
无论拥塞情况如何只要判定发生了拥塞,都将ssthresh变为一个安全值( ssthresh = ssthresh /2)。
收到连续相同确认。接收端无法判断是乱序到达,还是丢失报文。但是当收到了三个相同的确认,那接收端就认为报文丢失。 立刻重传,无需等待超时重传。
超时导致重传,这时认为网络堵塞,接近瘫痪。将cwnd = 1,极大的降低发送速率, 使网络能够恢复通常状态。
收到连续三个重复的确认包,这是认为网络发送一点拥堵,但是没有瘫痪。超时时将cwnd设置 = 1是为了让网络恢复。而发生一点拥堵只需要将cwnd设置为ssthresh,这样网络波动不会很大。如果将cwnd降低为1,那么这是网络利用率较低。
答案:在检测到丢包时,窗口为cwnd。这时候网络中最多有cwnd个包(in_flight < cwnd )。每当收到
一个重复的ACK,则说明有数据包离开网络,达到接收端了。那么,此时网络中还可以再容纳1个包。由
于发送端滑动窗口不能移动了,所以如果想保持in_flight,可以使cwnd++。
这样一来,可以提高吞吐量。而实际上,在fast recovery期间发送的新数据包比起发生丢包的cwnd来说,
TCP核心概念-慢启动,ssthresh,拥塞避免,公平性的真实含义(一定要看)
https://www.2cto.com/net/201605/509810.html
2*N = r*RTT 实际的带宽总是趋向于ssthresh的2倍
坚定定时器:收到0窗口后,用于周期性探寻窗口值变化。应用于当接收方发送窗口变化ack(发送方是不回包的),这时接收方开始等待收数据。但这个ack包丢失了,导致发送方在等待通知窗口变化。坚定定时器就是解决互相等待的情况。
路径MTU:当包不可分片,包大小超过设备的MTU,则设备会返回一个ICMP报文。通过这种机制探寻出路径MTU。(这个和通过ICMP打印那个路径相似)
数据校验:避免非主观因素造成的数据错误(防君子而防不了小人)
客户端异常关闭,如果服务器向其发送消息会收到一个RST回复。但是如果服务器没有发送数据包就会一直认为这个连接存在,服务器会一直维护一个连接状态占用资源。所以TCP引入保活机制,每2h进行一次探查,释放不存在的连接。
保活缺陷:检测周期长2h 只能检测到端到端的传输层通畅,也就是端到端可以发送和接受数据。但是应用层可能处于死锁等异常状态,保活是检测不到的。所以需要在应用层实现心跳机制。
五、应用层
规定应用进程通信所遵守的协议
1.DNS解析域名
客户端先检查本地是否有对应的IP地址,若找到则返回响应的IP地址。若没找到则请求上级DNS服务器,直至找到或到根节点。
DNS中递归查询和迭代查询的区别
1、 递归查询: 一般客户机和服务器之间属递归查询,即当客户机向DNS服务器发出请求后,若DNS服务器本身不能解析,则会向另外的DNS服务器发出查询请求,得到结果后转交客户机。
2、 迭代查询(反复查询): 一般DNS服务器之间属迭代查询,如:若DNS2不能响应DNS1的请求,则它会将DNS3的IP给DNS2,以便其再向DNS3发出请求。
以一个DNS请求解析为例:
1)用户发起域名请求到dnsA,这时dnsA有这个记录,将结果返回给用户,这个过程是递归查询。
2)用户发起域名请求到dnsA,这时dns没有这个记录,它去向dnsB问有没有这个记录,以此类推,直到把结果返回给用户,这个过程是递归查询。
3)用户发起域名请求到dnsA,这时dnsA没有这个记录,它告诉用户,我没有这个记录,你去问dnsB吧,这个过程是迭代查询。
2.FTP
异构网络主机间进行文件传输,屏蔽主机系统处理文件的差异性
本身不提供可靠的服务,而是由TCP提供
两条TCP连接:控制连接 数据连接
控制连接 : 访问控制 登陆验证..
数据连接 : 传输数据
用FTP对文件进行操作时是拷贝整个文件,如 A 主机修改B主机中文件,将B主机文件拷贝到A,修改后再拷贝回B。
TFTP:UDP进行传输 分块传输 序列号 重传
3.Telnet
远程终端控制协议 建立TCP连接,将操作转换成NVT格式传输到远程,远程还原NVT到操作,将操作结果转换成NVT格式传输到本地,本地显示操作结果。
4.WWW万维网
WWW万维网:从一个站点获取另一个站点信息 超文本(除了文本还有图片视频等) TCP
URL:资源定位符 inerter net定位资源的地址
URL = 协议://主机ip :端口 / 路径
请求一个网页过程:
建立HTTP连接 : 域名解析 + 建立连接
请求网页
返回网页信息
代理服务器(高速缓存):缓存网页内容,无需重新建立连接。
翻墙:通过中间服务器访问资源
两类报文:
请求报文 客户 到 服务器
响应报文 服务器 到 客户
请求报文 方法:
get : 请求资源
delete : 删除资源
put : 保存资源
post : 追加信息(修改)
cookies :服务器为用户生成一个唯一的标识码,返回给主机,主机下次再访问这个服务器时就用这个标识码。
html:万维网使用的一种语言,规定了网页的排版命令。
动态网页:提取信息 生成网页
CGI:定义动态文档如何创建
DHCP:动态主机配置,上网之前分配ip等必要信息。UDP报文
DHCP服务器分配的Ip是临时的。主机自动申请延长租用期。
主机---广播--->中继代理服务器------------单播-------->DHCP服务器
5.网络安全
被动攻击:截获
主动攻击:篡改 中断 伪造
数据加密:利用加密/解密 秘钥 进行数据处理 防止数据被他人监控 解析
对称加密体系:所用加密解密秘钥是一个,解密是加密算法的逆运算。
非对称加密: 每个用户有私钥 和公钥,公钥可被他人知道。私钥只有自己持有。 A 向 B发送数据,A先将自己的公钥发送给B,B将自己的公钥发送给A。这时两者都有彼此公钥,向对方发送数据时,用公钥加密即可。
他人无法解密,引用没有私钥。
数字签名:A向B发送报文,为了验证报文确实是A发的。A 将明文 通过A的私钥加密作为签名,发送给B后,B将签名使用A的公钥解密。如果解密后的明文 和 包中明文一样则可以验证是A发送的数据。
鉴别:鉴别通信双方身份,鉴别报文是否被篡改
报文鉴别:
如果只是 报文 + MD5 那么他人也可以伪造报文内容,将自己的报文也组装成 报文 + MD5 格式。 所以发送时要对MD5进行加密,这样他人就无法伪造了。
实体鉴别:整个通信过程只进行一次身份验证
防火墙:网络的访问控制,数据过滤等
验证内容是否被篡改使用 散列函数(A)
验证身份以及内容的私有性使用 秘钥进行加密
六、学习资料下载地址PFD+视频+图解
地址:百度网盘 请输入提取码
提取码:q1nq