概述
分类
- 按照网络的作用范围:广域网(WAN)、城域网(MAN)、局域网(LAN);
层次结构
-
TCP/IP四层模型与OSI体系结构对比:
-
四层传输层数据被称作「段」(Segments);
-
三层网络层数据被称做「包」(Packages);
-
二层数据链路层时数据被称为「帧」(Frames);
-
一层物理层时数据被称为「比特流」(Bits)。
层次结构设计的基本原则
- 各层之间是相互独立的;
- 每一层需要有足够的灵活性;
- 各层之间完全解耦。
性能指标
- 速率:bps=bit/s
- 时延:发送时延、传播时延、排队时延、处理时延
- 往返时间RTT:数据报文在端到端通信中的来回一次的时间。
物理层
-
首先解决两台物理机之间的通信需求,具体就是机器A往机器B发送比特流,机器B能收到比特流。物理层主要定义了物理设备的标准,如网线的类型,光纤的接口类型,各种传输介质的传输速率。
-
物理层的作用:连接不同的物理设备,传输比特流。该层为上层协议提供了一个传输数据的可靠的物理媒体。简单的说,物理层确保原始的数据可在各种物理媒体上传输。
-
物理层设备:
- 中继器【Repeater,也叫放大器】:同一局域网的再生信号;两端口的网段必须同一协议;5-4-3规程:10BASE-5以太网中,最多串联4个中继器,5段中只能有3个连接主机;
- 集线器:同一局域网的再生、放大信号(多端口的中继器);半双工,不能隔离冲突域也不能隔离广播域。
-
信道的基本概念:信道是往一个方向传输信息的媒体,一条通信电路包含一个发送信道和一个接受信道。
- 单工通信信道:只能一个方向通信,没有反方向反馈的信道;
- 半双工通信信道:双方都可以发送和接受信息,但不能同时发送也不能同时接收;
- 全双工通信信道:双方都可以同时发送和接收。
数据链路层
数据链路层概述
-
在传输比特流的过程中,会产生错传、数据传输不完整的可能。数据链路层定义了「如何格式化数据进行传输」,以及如何控制对物理介质的访问。通常提供错误检测和纠正,以确保数据传输的准确性。
-
数据链路层在物理层提供的服务的基础上向网络层提供服务,其最基本的服务是将源自网络层来的数据可靠地传输到相邻节点的目标机网络层。
-
该层的作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。
-
有关数据链路层的重要知识点:
- 数据链路层为网络层提供可靠的数据传输;
- 基本数据单位为帧;
- 主要的协议:以太网协议;
- 两个重要设备名称:网桥和交换机。
- 常见的协议有 HDLC、PPP、SLIP等
-
封装成帧:“帧”是数据链路层数据的基本单位:
-
透明传输:“透明”是指即使控制字符在帧数据中,但是要当做不存在去处理。即在控制字符前加上转义字符ESC。
数据链路层的差错监测
- 差错检测:奇偶校验码、循环冗余校验码CRC
- 奇偶校验码–局限性:当出错两位时,检测不到错误。
- 循环冗余检验码:根据传输或保存的数据而产生固定位数校验码。
最大传输单元MTU
- 最大传输单元MTU(Maximum Transmission Unit),数据链路层的数据帧不是无限大的,数据帧长度受MTU限制.
- 路径MTU:由链路中MTU的最小值决定。
MAC地址
- MAC称为物理地址,也叫硬件地址,用来定义网络设备的位置,MAC地址是网卡出厂时设定的,是固定的(但可以通过在设备管理器中或注册表等方式修改,同一网段内的MAC地址必须唯一)。
- MAC地址采用十六进制数表示,长度是6个字节(48位),分为前24位和后24位。
以太网协议详解
- MAC地址:每一个设备都拥有唯一的MAC地址,共48位,使用十六进制表示。
- 以太网协议:是一种使用广泛的局域网技术,是一种应用于数据链路层的协议,使用以太网可以完成相邻设备的数据帧传输:
- 局域网分类:
- Ethernet以太网IEEE802.3:
- 以太网第一个广泛部署的高速局域网
- 以太网数据速率快
- 以太网硬件价格便宜,网络造价成本低
- Ethernet以太网IEEE802.3:
- 以太网帧结构:
- 类型:标识上层协议(2字节)
- 目的地址和源地址:MAC地址(每个6字节)
- 数据:封装的上层协议的分组(46~1500字节)
- CRC:循环冗余码(4字节)
- 以太网最短帧:以太网帧最短64字节;以太网帧除了数据部分18字节;数据最短46字节;
- MAC地址(物理地址、局域网地址)
- MAC地址长度为6字节,48位;
- MAC地址具有唯一性,每个网络适配器对应一个MAC地址;
- 通常采用十六进制表示法,每个字节表示一个十六进制数,用 - 或 : 连接起来;
- MAC广播地址:FF-FF-FF-FF-FF-FF。
网络层
-
随着网络节点的不断增加,点对点通讯需要通过多个节点,如何找到目标节点,如何选择最佳路径成为首要需求。
网络层主要功能是将网络地址转化为对应的物理地址,并决定如何将数据从发送方路由到接收方。 -
网络层的目的是实现两个端系统之间的数据透明传送,具体功能包括寻址和路由选择、连接的建立、保持和终止等。数据交换技术是报文交换(基本上被分组所替代):采用储存转发方式,数据交换单位是报文。
-
网络层中涉及众多的协议,其中包括最重要的协议,也是TCP/IP的核心协议——IP协议。IP协议非常简单,仅仅提供不可靠、无连接的传送服务。IP协议的主要功能有:无连接数据报传输、数据报路由选择和差错控制。
-
与IP协议配套使用实现其功能的还有地址解析协议ARP、逆地址解析协议RARP、因特网报文协议ICMP、因特网组管理协议IGMP。具体的协议我们会在接下来的部分进行总结,有关网络层的重点为:
- 网络层负责对子网间的数据包进行路由选择。此外,网络层还可以实现拥塞控制、网际互连等功能;
- 基本数据单位为IP数据报;
- 包含的主要协议:
- IP协议(Internet Protocol,因特网互联协议);
- ICMP协议(Internet Control Message Protocol,因特网控制报文协议);
- ARP协议(Address Resolution Protocol,地址解析协议);
- RARP协议(Reverse Address Resolution Protocol,逆地址解析协议)。
- 重要的设备:路由器。
-
路由器相关协议图片
IP协议详解
- IP网际协议是 Internet 网络层最核心的协议。虚拟互联网络的产生:实际的计算机网络错综复杂;物理设备通过使用IP协议,屏蔽了物理网络之间的差异;当网络中主机使用IP协议连接时,无需关注网络细节,于是形成了虚拟网络。
- IP协议使得复杂的实际网络变为一个虚拟互联的网络;并且解决了在虚拟网络中数据报传输路径的问题。
- 「路由器」连接不同网段,负责不同网段之间的数据转发,「交换机」连接的是同一网段的计算机。
- 其中,版本指IP协议的版本,占4位,如IPv4和IPv6;首部位长度表示IP首部长度,占4位,最大数值位15;总长度表示IP数据报总长度,占16位,最大数值位65535;TTL表示IP数据报文在网络中的寿命,占8位;协议表明IP数据所携带的具体数据是什么协议的,如TCP、UDP。
IP协议的转发流程
子网掩码
- 通过子网掩码,才能表明一台主机所在的子网与其他子网的关系,使网络正常工作。
- 子网掩码和IP地址做与运算,分离出IP地址中的网络地址和主机地址,用于判断该IP地址是在本地网络上,还是在远程网络网上。
- 子网掩码还用于将网络进一步划分为若干子网,以避免主机过多而拥堵或过少而IP浪费。
- 为什么要使用子网掩码?
- 两台主机要通信,首先要判断是否处于同一网段,即网络地址是否相同。
- 如果相同,那么可以把数据包直接发送到目标主机,否则就需要路由网关将数据包转发送到目的地。
IP地址的子网划分
- A类(8网络号+24主机号)、B类(16网络号+16主机号)、C类(24网络号+8主机号)可以用于标识网络中的主机或路由器,D类地址作为组广播地址,E类是地址保留。
网络地址转换NAT技术
-
用于多个主机通过一个公有IP访问访问互联网的私有网络中,减缓了IP地址的消耗,但是增加了网络通信的复杂度。
-
NAT 工作原理:从内网出去的IP数据报,将其IP地址替换为NAT服务器拥有的合法的公共IP地址,并将替换关系记录到NAT转换表中;
-
从公共互联网返回的IP数据报,依据其目的的IP地址检索NAT转换表,并利用检索到的内部私有IP地址替换目的IP地址,然后将IP数据报转发到内部网络。
网关
- 网关实质上是一个网络通向其他网络的IP地址。
- 比如有网络A和网络B,网络A的IP地址范围为192.168.1.1~192. 168.1.254,子网掩码为255.255.255.0;网络B的IP地址范围为192.168.2.1~192.168.2.254,子网掩码为255.255.255.0。
- 在没有路由器的情况下,两个网络之间是不能进行TCP/IP通信的,即使是两个网络连接在同一台交换机(或集线器)上,TCP/IP协议也会根据子网掩码(255.255.255.0)判定两个网络中的主机处在不同的网络里。
- 而要实现这两个网络之间的通信,则必须通过网关。如果网络A中的主机发现数据包的目的主机不在本地网络中,就把数据包转发给它自己的网关,再由网关转发给网络B的网关,网络B的网关再转发给网络B的某个主机。网络B向网络A转发数据包的过程。所以说,只有设置好网关的IP地址,TCP/IP协议才能实现不同网络之间的相互通信。
ARP协议与RARP协议
- 地址解析协议 ARP(Address Resolution Protocol):为网卡(网络适配器)的IP地址到对应的硬件地址提供动态映射。可以把网络层32位地址转化为数据链路层MAC48位地址。
- ARP 是即插即用的,一个ARP表是自动建立的,不需要系统管理员来配置。
- RARP(Reverse Address Resolution Protocol)协议指逆地址解析协议,可以把数据链路层MAC48位地址转化为网络层32位地址。
ICMP协议详解
-
网际控制报文协议(Internet Control Message Protocol),可以报告错误信息或者异常情况,ICMP报文封装在IP数据报当中。
-
ICMP协议的应用:
- Ping应用:网络故障的排查;
- Traceroute应用:可以探测IP数据报在网络中走过的路径。
Ping
- Ping是我们测试网络连接的常用指令。
- 它利用ICMP报文检测网络连接。
- 「假设A ping B」
- ping通知系统建立一个固定格式的ICMP请求数据包。
- ICMP协议打包这个数据包和B的IP地址转交给IP协议层
- IP层协议将机器B的IP地址为目的地址,本机的IP地址为源地址,加上一些头部必要的控制信息,构建一个IP数据包
- 获取B的MAC地址,做这个操作首先机器A会判断B是否在同一网段内,若IP层协议通过B的IP地址和自己的子网掩码,发现它跟自己属于同一网络,就直接在本网络查找这台机器的MAC,否则则通过路由器进行类似查找。
- 接下来是ARP协议根据IP地址查找MAC地址的过程:
- 若两台机器之前有过通信,在机器A的ARP缓存表里应该存有B的IP与其MAC地址的映射关系。
- 若没有,则通过发送ARP请求广播,得到回应的B机器MAC地址,并交给数据链路层
- 数据链路层构建一个数据帧,目的地址是IP层传过来的MAC地址,源地址是本机的MAC地址,再附加一些必要的控制信息,依据以太网的介质访问规则将他们传送出去
- 机器B收到这个数据帧后,先检查目的地址,和本机MAC地址对比:符合,接受,接收后检查该数据帧,将IP数据包从帧中提取出来,交给本机的的IP地址协议层协议,IP协议层检查之后,将有用的信息提取给ICMP协议,后者处理,马上构建一个ICMP应答包,发送给A,其过程和主机A发送ICMP请求包到B的过程类似,但不用ARP广播收取A的信息,因为请求包中已经有足够的信息用于B回应A。若不符合,丢弃。
- 可以知道PING的过程即一段发送报文和接受确认报文的过程,在来回直接可以计算时延。
网络层的路由概述
- 关于路由算法的要求:正确的完整的、在计算上应该尽可能是简单的、可以适应网络中的变化、稳定的公平的。
- 自治系统AS:指处于一个管理机构下的网络设备群,AS内部网络自治管理,对外提供一个或多个出入口,其中自治系统内部的路由协议为内部网关协议,如RIP、OSPF等;自治系统外部的路由协议为外部网关协议,如BGP。
- 静态路由:人工配置,难度和复杂度高;
- 动态路由:
- 链路状态路由选择算法LS:向所有隔壁路由发送信息收敛快;全局式路由选择算法,每个路由器计算路由时,需构建整个网络拓扑图;利用Dijkstra算法求源端到目的端网络的最短路径;Dijkstra(迪杰斯特拉)算法
- 距离-向量路由选择算法DV:向所有隔壁路由发送信息收敛慢、会存在回路;基础是Bellman-Ford方程(简称B-F方程);
内部网关路由协议之RIP协议
-
路由信息协议 RIP(Routing Information Protocol)【应用层】,基于距离-向量的路由选择算法,较小的AS(自治系统),适合小型网络;RIP报文,封装进UDP数据报。
-
RIP协议特性:
- RIP在度量路径时采用的是跳数(每个路由器维护自身到其他每个路由器的距离记录);
- RIP的费用定义在源路由器和目的子网之间;
- RIP被限制的网络直径不超过15跳;
- 和隔壁交换所有的信息,30主动一次(广播)。
内部网关路由协议之OSPF协议
-
开放最短路径优先协议 OSPF(Open Shortest Path First)【网络层】,基于链路状态的路由选择算法(即Dijkstra算法),较大规模的AS ,适合大型网络,直接封装在IP数据报传输。
-
OSPF协议优点:
- 安全;
- 支持多条相同费用路径;
- 支持区别化费用度量;
- 支持单播路由和多播路由;
- 分层路由。
-
RIP与OSPF的对比(路由算法决定其性质):
外部网关路由协议之BGP协议
- BGP(Border Gateway Protocol)边际网关协议【应用层】:是运行在AS之间的一种协议,寻找一条好路由:首次交换全部信息,以后只交换变化的部分,BGP封装进TCP报文段.
传输层
-
随着网络通信需求的进一步扩大,通信过程中需要发送大量的数据,如海量文件传输,可能需要很长时间,网络在通信的过程中会中断很多次,此时为了保证传输大量文件时的准确性,需要对发送出去的数据进行切分,切割为一个一个的段落(Segement)发送,其中一个段落丢失是否重传,段落是否按顺序到达,是传输层需要考虑的问题。
-
第一个端到端,即主机到主机的层次。传输层负责将上层数据分段并提供端到端的、可靠的或不可靠的传输。此外,传输层还要处理端到端的差错控制和流量控制问题。
-
传输层的任务是根据通信子网的特性,最佳的利用网络资源,为两个端系统的会话层之间,提供建立、维护和取消传输连接的功能,负责端到端的可靠数据传输。在这一层,信息传送的协议数据单元称为段或报文。
-
网络层只是根据网络地址将源结点发出的数据包传送到目的结点,而传输层则负责将数据可靠地传送到相应的端口。
-
有关传输层的重点:
- 传输层负责将上层数据分段并提供端到端的、可靠的或不可靠的传输以及端到端的差错控制和流量控制问题;
- 包含的主要协议:TCP协议(Transmission Control Protocol,传输控制协议)、UDP协议(User Datagram Protocol,用户数据报协议);
- 重要设备:网关。
-
基于TCP和UDP的常用协议
- HTTP、HTTPS、FTP、TELNET、SMTP(简单邮件传输协议)协议基于可靠的TCP协议。
- TFTP、DNS、DHCP、TFTP、SNMP(简单网络管理协议)、RIP基于不可靠的UDP协议
UDP协议详解
-
UDP(User Datagram Protocol: 用户数据报协议),是一个非常简单的协议,
-
UDP协议的特点:
- UDP是无连接协议;
- UDP不能保证可靠的交付数据;
- UDP是面向报文传输的;
- UDP没有拥塞控制;
- UDP首部开销很小。
-
UDP数据报结构:
- 首部:8B,四字段/2B【源端口 | 目的端口 | UDP长度 | 校验和】 数据字段:应用数据图片
TCP协议详解
-
TCP(Transmission Control Protocol: 传输控制协议),是计算机网络中非常复杂的一个协议。
-
TCP协议的功能:
- 对应用层报文进行分段和重组;
- 面向应用层实现复用与分解;
- 实现端到端的流量控制;
- 拥塞控制;
- 传输层寻址;
- 对收到的报文进行差错检测(首部和数据部分都检错);
- 实现进程间的端到端可靠数据传输控制。
-
TCP协议的特点:
- TCP是面向连接的协议;
- TCP是面向字节流的协议;
- TCP的一个连接有两端,即点对点通信;
- TCP提供可靠的传输服务;
- TCP协议提供全双工通信(每条TCP连接只能一对一);
TCP报文段结构:
-
最大报文段长度:报文段中封装的应用层数据的最大长度。
-
TCP首部:
-
序号字段:TCP的序号是对每个应用层数据的每个字节进行编号
-
确认序号字段:期望从对方接收数据的字节序号,即该序号对应的字节尚未收到。用ack_seq标识;
-
TCP段的首部长度最短是20B ,最长为60字节。但是长度必须为4B的整数倍
-
TCP标记的作用:
可靠传输的基本原理
-
基本原理:
- 不可靠传输信道在数据传输中可能发生的情况:比特差错、乱序、重传、丢失
- 基于不可靠信道实现可靠数据传输采取的措施:
-
差错检测:利用编码实现数据包传输过程中的比特差错检测 确认:接收方向发送方反馈接收状态 重传:发送方重新发送接收方没有正确接收的数据 序号:确保数据按序提交 计时器:解决数据丢失问题;
- 停止等待协议:是最简单的可靠传输协议,但是该协议对信道的利用率不高。
- 连续ARQ(Automatic Repeat reQuest:自动重传请求)协议:滑动窗口+累计确认,大幅提高了信道的利用率。
TCP协议的可靠传输
- 基于连续ARQ协议,在某些情况下,重传的效率并不高,会重复传输部分已经成功接收的字节。
TCP协议的流量控制
- 流量控制:让发送方发送速率不要太快,TCP协议使用滑动窗口实现流量控制。
TCP协议的拥塞控制
- 拥塞控制与流量控制的区别:流量控制考虑点对点的通信量的控制,而拥塞控制考虑整个网络,是全局性的考虑。拥塞控制的方法:慢启动算法+拥塞避免算法。
- 慢启动:慢开始算法的思路就是,不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小。
- 拥塞避免算法:让拥塞窗口cwnd缓慢地增大,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍。这样拥塞窗口cwnd按线性规律缓慢增长,比慢开始算法的拥塞窗口增长速率缓慢得多
-
慢开始和拥塞避免:
- 【慢开始】拥塞窗口从1指数增长;
- 到达阈值时进入【拥塞避免】,变成+1增长;
- 【超时】,阈值变为当前cwnd的一半(不能<2);
- 再从【慢开始】,拥塞窗口从1指数增长。
-
快重传算法: 快重传要求接收方在收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方,可提高网络吞吐量约20%)而不要等到自己发送数据时捎带确认。快重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期
-
快恢复算法: 快重传配合使用的还有快恢复算法,有以下两个要点:当发送方连续收到三个重复确认时,就把ssthresh门限减半(为了预防网络发生拥塞); 但是接下去并不执行慢开始算法
-
快重传和快恢复:
- 发送方连续收到3个冗余ACK,执行【快重传】,不必等计时器超时;
- 执行【快恢复】,阈值变为当前cwnd的一半(不能<2),并从此新的ssthresh点进入【拥塞避免】。
TCP连接的三次握手(重要)
- TCP三次握手使用指令:
-
面试常客:为什么需要三次握手?
- 第一次握手:客户发送请求,此时服务器知道客户能发;
- 第二次握手:服务器发送确认,此时客户知道服务器能发能收;
- 第三次握手:客户发送确认,此时服务器知道客户能收。
-
建立连接(三次握手):
- 第一次:客户向服务器发送连接请求段,建立连接请求控制段(SYN=1),表示传输的报文段的第一个数据字节的序列号是x,此序列号代表整个报文段的序号(seq=x);客户端进入 SYN_SEND (同步发送状态);
- 第二次:服务器发回确认报文段,同意建立新连接的确认段(SYN=1),确认序号字段有效(ACK=1),服务器告诉客户端报文段序号是y(seq=y),表示服务器已经收到客户端序号为x的报文段,准备接受客户端序列号为x+1的报文段(ack_seq=x+1);服务器由LISTEN进入SYN_RCVD (同步收到状态);
- 第三次:客户对服务器的同一连接进行确认.确认序号字段有效(ACK=1),客户此次的报文段的序列号是x+1(seq=x+1),客户期望接受服务器序列号为y+1的报文段(ack_seq=y+1);当客户发送ack时,客户端进入ESTABLISHED 状态;当服务收到客户发送的ack后,也进入ESTABLISHED状态;第三次握手可携带数据;
-
TCP为什么三次握手而不是两次握手?
- 为了实现可靠数据传输, TCP 协议的通信双方, 都必须维护一个序列号, 以标识发送出去的数据包中, 哪些是已经被对方收到的。三次握手的过程即是通信双方相互告知序列号起始值, 并确认对方已经收到了序列号起始值的必经步骤
- 如果只是两次握手, 至多只有连接发起方的起始序列号能被确认, 另一方选择的序列号则得不到确认
TCP连接的四次挥手(重要)
-
释放连接(四次挥手)
- 第一次:客户向服务器发送释放连接报文段,发送端数据发送完毕,请求释放连接(FIN=1),传输的第一个数据字节的序号是x(seq=x);客户端状态由ESTABLISHED进入FIN_WAIT_1(终止等待1状态);
- 第二次:服务器向客户发送确认段,确认字号段有效(ACK=1),服务器传输的数据序号是y(seq=y),服务器期望接收客户数据序号为x+1(ack_seq=x+1);服务器状态由ESTABLISHED进入CLOSE_WAIT(关闭等待);客户端收到ACK段后,由FIN_WAIT_1进入FIN_WAIT_2;
- 第三次:服务器向客户发送释放连接报文段,请求释放连接(FIN=1),确认字号段有效(ACK=1),表示服务器期望接收客户数据序号为x+1(ack_seq=x+1);表示自己传输的第一个字节序号是y+1(seq=y+1);服务器状态由CLOSE_WAIT 进入 LAST_ACK (最后确认状态);
- 第四次:客户向服务器发送确认段,确认字号段有效(ACK=1),表示客户传输的数据序号是x+1(seq=x+1),表示客户期望接收服务器数据序号为y+1+1(ack_seq=y+1+1);客户端状态由FIN_WAIT_2进入TIME_WAIT,等待2MSL时间,进入CLOSED状态;服务器在收到最后一次ACK后,由LAST_ACK进入CLOSED;
-
为什么需要等待2MSL?
- 最后一个报文没有确认;
- 确保发送方的ACK可以到达接收方
- 2MSL时间内没有收到,则接收方会重发
- 确保当前连接的所有报文都已经过期。
-
为什么连接的时候是三次握手,关闭的时候却是四次握手?
- 建立连接时因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。所以建立连接只需要三次握手。
- 由于TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议,TCP是全双工模式。
- 这就意味着,关闭连接时,当Client端发出FIN报文段时,只是表示Client端告诉Server端数据已经发送完毕了。当Server端收到FIN报文并返回ACK报文段,表示它已经知道Client端没有数据发送了,但是Server端还是可以发送数据到Client端的,所以Server很可能并不会立即关闭SOCKET,直到Server端把数据也发送完毕。
- 当Server端也发送了FIN报文段时,这个时候就表示Server端也没有数据要发送了,就会告诉Client端,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。
Socket
- 即套接字,是应用层 与 TCP/IP 协议族通信的中间软件抽象层,表现为一个封装了 TCP / IP协议族 的编程接口(API)
- Socket不是一种协议,而是一个编程调用接口(API),属于传输层(主要解决数据如何在网络中传输)
- 对用户来说,只需调用Socket去组织数据,以符合指定的协议,即可通信
会话层
- 自动收发包,自动寻址。会话层作用是「负责建立和断开通信连接」,何时建立,断开连接以及保持多久的连接。常见的协议有 ADSP、RPC 等
表示层
- Linux给WIndows发包,不同系统语法不一致,如exe不能在Linux下执行,shell不能在Windows不能直接运行。于是需要表示层。
- 解决「不同系统之间通信语法问题」,在表示层数据将按照网络能理解的方案进行格式化,格式化因所使用网络的不同而不同。它主要负责数据格式的转换。具体来说,就是讲设备固有的数据格式转换为网络标准格式。常见的协议有ASCII、SSL/TLS 等
应用层
-
规定发送方和接收方必须使用一个固定长度的消息头,消息头必须使用某种固定的组成,消息头中必须记录消息体的长度等信息,方便接收方正确解析发送方发送的数据。
-
应用层旨在更「方便应用从网络中接收的数据」,重点关注TCP/IP协议中的HTTP协议
-
为操作系统或网络应用程序提供访问网络服务的接口。
-
应用层重点:
- 数据传输基本单位为报文;
- 包含的主要协议:FTP(文件传送协议)、Telnet(远程登录协议)、DNS(域名解析协议)、SMTP(邮件传送协议),POP3协议(邮局协议),HTTP协议(Hyper Text Transfer Protocol)。
DNS详解
-
DNS(Domain Name System:域名系统)【C/S,UDP,端口53】:解决IP地址复杂难以记忆的问题,存储并完成自己所管辖范围内主机的 域名 到 IP 地址的映射。
-
DNS通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。我们更习惯于记住一个网站的名字,www.baidu,而不是记住它的ip地址,比如:167.23.10.2;将主机域名转换为ip地址,属于应用层协议,使用UDP传输。
-
域名解析的顺序:
- 【1】浏览器缓存,
- 【2】找本机的hosts文件,
- 【3】路由缓存,
- 【4】找DNS服务器(本地域名、顶级域名、根域名)->迭代解析、递归查询。
-
IP—>DNS服务—>便于记忆的域名
-
域名由点、字母和数字组成,分为顶级域(com,cn,net,gov,org)、二级域(baidu,taobao,qq,alibaba)、三级域(www)(12-2-0852)
DNS
DHCP协议详解
- DHCP(Dynamic Configuration Protocol:动态主机设置协议):是一个局域网协议,是应用UDP协议的应用层协议。作用:为临时接入局域网的用户自动分配IP地址。
HTTP协议详解
-
文件传输协议(FTP):控制连接(端口21):传输控制信息(连接、传输请求),以7位ASCII码的格式。整个会话期间一直打开。
-
HTTP(HyperText Transfer Protocol:超文本传输协议)【TCP,端口80】:是可靠的数据传输协议,浏览器向服务器发收报文前,先建立TCP连接,HTTP使用TCP连接方式(HTTP自身无连接)。
-
HTTP请求报文方式:
- GET:请求指定的页面信息,并返回实体主体;
- POST:向指定资源提交数据进行处理请求;
- DELETE:请求服务器删除指定的页面;
- HEAD:请求读取URL标识的信息的首部,只返回报文头;
- OPETION:请求一些选项的信息;
- PUT:在指明的URL下存储一个文档。
###「GET请求和POST请求的区别」
- GET 请求的请求参数是添加到 head 中,可以在 url 中可以看到;POST 请求的请求参数是添加到body中,在url 中不可见。
- 请求的url有长度限制,因为GET请求的参数是添加到URL中,所以GET请求的URL的长度限制需要将请求参数长度也考虑进去。而POST请求不用考虑请求参数的长度。
- GET请求产生一个数据包; POST请求产生2个数据包,先发送请求头,再发送请求体,因为GET没有请求体,所以就发送一个数据包,而POST包含请求体,所以发送两次数据包,但是由于火狐机制不同,所以发送一个数据包。
- GET 请求会被浏览器主动缓存下来,留下历史记录,而 POST 默认不会。
- GET是幂等的,而POST不是(幂等表示执行相同的操作,结果也是相同的)
- GET是获取数据,POST是修改数据
状态码
- 1XX:指示信息,表示请求以接收,继续处理
- 2XX:成功,表示请求已经被成功接收、理解、接受
- 200 OK 是最常见的成功状态码,表示一切正常。如果是非 HEAD 请求,服务器返回的响应头都会有 body 数据。
- 204 No Content 也是常见的成功状态码,与 200 OK 基本相同,但响应头没有 body 数据。
- 206 Partial Content 是应用于 HTTP 分块下载或断电续传,表示响应返回的 body 数据并不是资源的全部,而是其中的一部分,也是服务器处理成功的状态。
- 3XX:状态码表示客户端请求的资源发送了变动,需要客户端用新的 URL 重新发送请求获取资源,也就是「重定向」。
- 301 Moved Permanently 表示永久重定向,说明请求的资源已经不存在了,需改用新的 URL 再次访问,搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址。
- 302 Moved Permanently 表示临时重定向,说明请求的资源还在,但暂时需要用另一个 URL 来访问,搜索引擎会抓取新的内容而保存旧的网址。
- 301 和 302 都会在响应头里使用字段 Location,指明后续要跳转的 URL,浏览器会自动重定向新的 URL。
- 304 Not Modified不具有跳转的含义,表示资源未修改,重定向已存在的缓冲文件,也称缓存重定向,用于缓存控制。
- 4XX:状态码表示客户端发送的「报文有误」,服务器无法处理,也就是错误码的含义。
- 400 Bad Request表示客户端请求的报文有错误。
- 401 Unauthorized:缺失或错误的认证,这个状态代码必须和WWW-Authenticate报头域一起使用。
- 403 Forbidden表示服务器禁止访问资源,并不是客户端的请求出错。
- 404 Not Found表示请求的资源在服务器上不存在或未找到,所以无法提供给客户端。
- 5XX:状态码表示客户端请求报文正确,但是「服务器处理时内部发生了错误」,属于服务器端的错误码。
- 501 Not Implemented 表示客户端请求的功能还不支持。
- 502 Bad Gateway 通常是服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发生了错误。
- 503 Service Unavailable 表示服务器当前很忙,暂时无法响应服务器。
- 504 Gateway Timeout:网关超时,由作为代理或网关的服务器使用,表示不能及时地从远程服务器获得应答。
「301和302的区别」
- 301重定向,指页面永久性转移,表示为资源或页面永久性地转移到了另一个位置。
- 301是HTTP协议中的一种状态码,当用户或搜索引擎向服务器发出浏览请求时,服务器返回的HTTP数据流中头信息中包含状态码 301 ,表示该资源已经永久改变了位置。
- 302重定向是页面暂时性转移,搜索引擎会抓取新的内容而保存旧的网址并认为新的网址只是暂时的。
HTTP1.1
- 长连接:HTTP 1.1支持长连接;HTTP 1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求。HTTP 1.1则支持持久连接Persistent Connection,并且默认使用,在同一个TCP的连接中可以传送多个HTTP请求和响应,多个请求和响应可以重叠,多个请求和响应可以同时进行,更加多的请求头和响应头
- 管道网络传输:HTTP/1.1 采用了长连接的方式,这使得管道网络传输成为了可能。即可在同一个 TCP 连接里面,客户端可以发起多个请求,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以「减少整体的响应时间。
- 100Status:HTTP/1.1加入了一个新的状态码100。客户端事先发送一个只带头域的请求,如果服务器因为权限拒绝了请求,就回送响应码401(Unauthorized);如果服务器接收此请求就回送响应码100,客户端就可以继续发送带实体的完整请求了。100状态代码的使用,允许客户端在发request消息body之前先用request header试探一下server,看server要不要接收request body,再决定要不要发request body。
- Chunked Transfer Coding:HTTP/1.1将发送方将消息分割成若干个任意大小的数据块,每个数据块在发送时都会附上块的长度,最后用一个零长度的块作为消息结束的标志。
- Cache :HTTP/1.1在1.0的基础上加入了一些Cache的新特性,当缓存对象的Age超过Expire时变为Stable对象,Cache不需要直接抛弃Stable对象,而是与源服务器进行重新激活。
HTTP2.0
- 新的二进制格式,HTTP1.x的解析是基于文本
- 多路复用,即连接共享,即每一个request都是是用作连接共享机制的,一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面
- header压缩,HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小
- 服务端推送:HTTP/2 还在一定程度上改善了传统的请求 - 应答工作模式,服务不再是被动地响应,也可以「主动」向客户端发送消息。
- 数据流:HTTP/2 的数据包不是按顺序发送的,同一个连接里面连续的数据包,可能属于不同的回应。因此,必须要对数据包做标记,指出它属于哪个回应。每个请求或回应的所有数据包,称为一个数据流(Stream)。每个数据流都标记着一个独一无二的编号,其中规定客户端发出的数据流编号为奇数, 服务器发出的数据流编号为偶数
HTTP3.0
- 使用UDP协议
- HTTP/2 主要的问题在于:多个 HTTP 请求在复用一个 TCP 连接,下层的 TCP 协议是不知道有多少个 HTTP 请求的。所以一旦发生了丢包现象,就会触发 TCP 的重传机制,这样在一个 TCP 连接中的「所有的 HTTP 请求都必须等待这个丢了的包被重传回来」。
- HTTP/1.1 中的管道传输中如果有一个请求阻塞了,那么队列后请求也统统被阻塞住了
- HTTP/2 多请求复用一个TCP连接,一旦发生丢包,就会阻塞住所有的 HTTP 请求。
- 这都是基于 TCP 传输层的问题,所以 「HTTP/3 把 HTTP 下层的 TCP 协议改成了 UDP!」
HTTPS
HTTPS协议详解
- HTTPS(Secure)是安全的HTTP协议,端口号443。基于HTTP协议,通过SSL或TLS提供加密处理数据、验证对方身份以及数据完整性保护。
- HTTP 是明文传输协议,HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全
- HTTPS比HTTP更加安全,对搜索引擎更友好,利于SEO,谷歌、百度优先索引HTTPS网页
- HTTPS需要用到SSL证书,而HTTP不用
- HTTPS标准端口443,HTTP标准端口80
- HTTPS基于传输层,HTTP基于应用层
- HTTPS在浏览器显示绿色安全锁,HTTP没有显示
- HTTPS 协议会对传输的数据进行加密,而加密过程是使用了非对称加密实现
- Client发起一个HTTPS的请求
- Server把事先配置好的公钥证书返回给客户端。
- Client验证公钥证书:比如是否在有效期内,证书的用途是不是匹配Client请求的站点,是不是在CRL吊销列表里面,它的上一级证书是否有效,这是一个递归的过程,直到验证到根证书(操作系统内置的Root证书或者Client内置的Root证书),如果验证通过则继续,不通过则显示警告信息。
- Client使用伪随机数生成器生成加密所使用的对称密钥,然后用证书的公钥加密这个对称密钥,发给Server。
- Server使用自己的私钥解密这个消息,得到对称密钥。至此,Client和Server双方都持有了相同的对称密钥。
- Server使用对称密钥加密明文内容A,发送给Client。
- Client使用对称密钥解密响应的密文,得到明文内容A。
- Client再次发起HTTPS的请求,使用对称密钥加密请求的明文内容B,然后Server使用对称密钥解密密文,得到明文内容B。
加密算法
- 加密算法分「对称加密」 和 「非对称加密」,其中对称加密算法的加密与解密密钥相同,非对称加密算法的加密密钥与解密密钥不同,此外,还有一类不需要密钥的「散列算法」。
- 常见的 「对称加密」 算法主要有 DES、3DES、AES 等,常见的 「非对称算法」 主要有 RSA、DSA 等,「散列算法」 主要有 SHA-1、MD5 等。
对称加密
- 在 对称加密算法中,使用的密钥只有一个,发送和接收双方都使用这个密钥对数据进行 加密和 解密。
- 数据加密过程:在对称加密算法中,数据发送方 将 明文 (原始数据) 和 加密密钥 一起经过特殊 加密处理,生成复杂的 加密密文 进行发送。
- 数据解密过程:「数据接收方」 收到密文后,若想读取原数据,则需要使用 「加密使用的密钥」 及相同算法的 「逆算法」 对加密的密文进行解密,才能使其恢复成 「可读明文」。
非对称加密
- 非对称加密算法」,它需要两个密钥,一个称为 「公开密钥」 (public key),即 「公钥」,另一个称为 「私有密钥」 (private key),即 「私钥」。
- 因为 「加密」 和 「解密」 使用的是两个不同的密钥,所以这种算法称为 「非对称加密算法」。
- 如果使用 「公钥」 对数据 「进行加密」,只有用对应的 「私钥」 才能 「进行解密」。
- 如果使用 「私钥」 对数据 「进行加密」,只有用对应的 「公钥」 才能 「进行解密」。
- 「例子」:甲方生成 「一对密钥」 并将其中的一把作为 「公钥」 向其它人公开,得到该公钥的 「乙方」 使用该密钥对机密信息 「进行加密」 后再发送给甲方,甲方再使用自己保存的另一把 「专用密钥」 (「私钥」),对 「加密」 后的信息 「进行解密」。
网络攻击
SQL注入
- SQL注入的原理是将SQL代码伪装到输入参数中,传递到服务器解析并执行的一种攻击手法。
- 「SQL注入攻击实例」
- 比如,在一个登录界面,要求输入用户名和密码,可以这样输入实现免帐号登录
- 用户名: ‘or 1 = 1 –
- 密 码:
- 用户一旦点击登录,如若没有做特殊处理,那么这个非法用户就很得意的登陆进去了。
- 下面我们分析一下:从理论上说,后台认证程序中会有如下的SQL语句:
- String sql = “select * from user_table where username=’ “+userName+” ’ and password=’ “+password+” ‘”;
- 因此,当输入了上面的用户名和密码,上面的SQL语句变成:
- SELECT * FROM user_table WHERE username=’’or 1 = 1 –- and password=’’
- 分析上述SQL语句我们知道,username=‘ or 1=1 这个语句一定会成功;然后后面加两个 -,这意味着注释,它将后面的语句注释,让他们不起作用,这样,上述语句永远都能正确执行,用户轻易骗过系统,获取合法身份。
- 应对方法:预编译,使用预编译手段,绑定参数是最好的防SQL注入的方法。
- 目前许多的ORM框架及JDBC等都实现了SQL预编译和参数绑定功能,攻击者的恶意SQL会被当做SQL的参数而不是SQL命令被执行。
- 在mybatis的mapper文件中,对于传递的参数我们一般是使用 # 和$来获取参数值。
- 当使用#时,变量是占位符,就是一般我们使用java的jdbc的PrepareStatement时的占位符,所有可以防止sql注入;
- 当使用$时,变量就是直接追加在sql中,一般会有sql注入问题。
- 使用正则表达式过滤传入的参数
- 过滤参数中含有的一些数据库关键词
CSRF和XSS
- XSS:跨站脚本是一种网站应用程序的安全漏洞攻击,是代码注入的一种。
- 它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响,这类攻击通常包含了HTML以及用户端脚本语言。
- 比如通过客户端脚本语言(最常见如:JavaScript)
- 在一个论坛发帖中发布一段恶意的JavaScript代码就是脚本注入,如果这个代码内容有请求外部服务器,那么就叫做XSS
- XSS攻击分类:
- 反射性XSS攻击 (非持久性XSS攻击)
- 例如,正常发送消息:
- http://www.test/message.php?send=Hello,World!
- 接收者将会接收信息并显示HelloWorld;但是,非正常发送消息:
- http://www.test/message.php?send=!
- 接收者接收消息显示的时候将会弹出警告窗口!
- 持久性XSS攻击 (留言板场景):一般指XSS攻击代码存储在网站数据库,当一个页面被用户打开的时候执行。
- 每当用户使用浏览器打开指定页面时,脚本便执行。
- 与非持久性XSS攻击相比,持久性XSS攻击危害性更大。
- 从名字就可以了解到,持久性XSS攻击就是将攻击代码存入数据库中,然后客户端打开时就执行这些攻击代码。
- 例如,留言板表单中的表单域:
- 反射性XSS攻击 (非持久性XSS攻击)
<input type="text" name="content" value="这里是用户填写的数据">
正常操作流程是:用户是提交相应留言信息 — 将数据存储到数据库 — 其他用户访问留言板,应用去数据并显示;
而非正常操作流程是攻击者在value填写:
<script>alert(‘foolish!’);</script> <!--或者html其他标签(破坏样式。。。)、一段攻击型代码-->
并将数据提交、存储到数据库中;当其他用户取出数据显示的时候,将会执行这些攻击性代码
-
CSRF:跨站请求伪造,是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。
-
比如冒充用户发起请求(在用户不知情的情况下),完成一些违背用户意愿的请求(如恶意发帖,删帖,改密码,发邮件等)。
DOS攻击
-
DOS:中文名称是拒绝服务,该攻击的效果是使得计算机或网络无法提供正常的服务
-
原理:首先攻击者向被攻击的服务器发送大量的虚假IP请求,被攻击者在收到请求后返回确认信息,等待攻击者进行确认,该过程需要TCP的三次握手,由于攻击者发送的请求信息是虚假的,所以服务器接收不到返回的确认信息,在一段时间内服务器会处与等待状态,而分配给这次请求的资源却被有被释放
-
当被攻击者等待一定的时间后,会因连接超时而断开,这时攻击者在次发送新的虚假信息请求,这样最终服务器资源被耗尽,直到瘫痪
-
DDOS:中文名称是分布式拒绝服务攻击:指的是攻击者控制多台主机同时向同一主机或网络发起DOS攻击,DRDoS分布反射式拒绝服务攻击这是DDoS攻击的变形
-
DDOS究竟如何攻击?
- 目前最流行也是最好用的攻击方法就是使用SYN-Flood进行攻击,SYN-Flood也就是SYN洪水攻击;
- SYN-Flood不会完成TCP三次握手的第三步,也就是不发送确认连接的信息给服务器,这样,服务器无法完成第三次握手,但服务器不会立即放弃,服务器会不停的重试并等待一定的时间后放弃这个未完成的连接,这段时间叫做SYN timeout,这段时间大约30秒-2分钟左右。
- 若是一个用户在连接时出现问题导致服务器的一个线程等待1分钟并不是什么大不了的问题,但是若有人用特殊的软件大量模拟这种情况,那后果就可想而知了。一个服务器若是处理这些大量的半连接信息而消耗大量的系统资源和网络带宽,这样服务器就不会再有空余去处理普通用户的正常请求(因为客户的正常请求比率很小),这样这个服务器就无法工作了,这种攻击就叫做SYN-Flood攻击
-
下面就是一些防御方法:」
- 关闭不必要的服务
- 限制同时打开的SYN半连接数目
- 缩短SYN半连接的time out 时间
- 正确设置防火墙
- 禁止对主机的非开放服务的访问
- 限制特定IP地址的访问
- 启用防火墙的防DDoS的属性
Cookie和Session
-
Session 是「基于Cookie 实现」的另一种记录服务端和客户端会话状态的机制。
-
Session 是存储在服务端,而 SessionId 会被存储在客户端的 Cookie 中。
-
Session 的「认证过程」:
- 客户端第一次发送请求到服务端,服务端根据信息创建对应的 Session,并在响应头返回 SessionID
- 客户端接收到服务端返回的 SessionID 后,会将此信息存储在 Cookie 上,同时会记录这个 SessionID 属于哪个域名
- 当客户端再次访问服务端时,请求会自动判断该域名下是否存在 Cookie 信息,如果有则发送给服务端,服务端会从 Cookie 中拿到 SessionID,再根据 SessionID 找到对应的 Session,如果有对应的 Session 则通过,继续执行请求,否则就中断
-
Cookie和Session的区别?
- 安全性,因为 Cookie 可以通过客户端修改,而 Session 只能在服务端设置,所以安全性比 Cookie 高,一般会用于验证用户登录状态
- 适用性,Cookie 只能存储字符串数据,而 Session 可以存储任意类型数据
- 有效期,Cookie 可以设置任意时间有效,而 Session 一般失效时间短
面试相关
在浏览器地址栏键入URL
-
DNS解析:浏览器会依据URL逐层查询DNS服务器缓存,解析URL中的域名对应的IP地址,DNS缓存从近到远依次是浏览器缓存、系统缓存、路由器缓存、IPS服务器缓存、域名服务器缓存、顶级域名服务器缓存。从哪个缓存找到对应的IP直接返回,不再查询后面的缓存。
-
TCP连接:结合三次握手
-
发送HTTP请求:浏览器发出读取文件的HTTP请求,该请求发送给服务器
-
服务器处理请求并返回HTTP报文:服务器对浏览器请求做出响应,把对应的带有HTML文本的HTTP响应报文发送给浏览器
-
浏览器解析渲染页面
-
连接结束:浏览器释放TCP连接,该步骤即四次挥手。
第5步和第6步可以认为是同时发生的,哪一步在前没有特别的要求
面试题20个
https://mp.weixin.qq/s/2Mtg_UGF7yb3JF4qqVK8yA
《面试八股文》之网络19卷
- TCP/IP 网络模型有几层?分别有什么用?
- 介绍一下 HTTP 协议吧
- GET 和 POST有什么区别?
- PING 的作用?
- 常见的 HTTP 状态码有哪些
- HTTP1.1 和 HTTP1.0 的区别有哪些?
- HTTPS 和 HTTP 的区别是什么?
- HTTP2 和 HTTP1.1 的区别是什么?
- HTTP3 和 HTTP2 的区别是什么?
- TCP 建立连接的过程是怎样的?
- 为什么是三次握手???
- TCP 断开连接的过程是怎样的?
- 第四次挥手为什么要等待2MSL(60s)
- 为什么是四次挥手?
- TCP 滑动窗⼝是什么?
- 发送方一直发送数据,但是接收方处理不过来怎么办?(流量控制)
- TCP 半连接队列和全连接队列是什么?
- 粘包/拆包是怎么发生的?怎么解决这个问题?
- 浏览器地址栏输入网站按回车后发生了什么?
20道计算机网络面试题
https://mp.weixin.qq/s/oAZ9S6YG9gITreIrqwEstA
20道计算机网络面试题
网络拓扑实战
https://mp.weixin.qq/s/ftkXl-45gKWY3DfjQvKywQ
拜托,面试请不要问我网络了!
名词概念
https://mp.weixin.qq/s/R9CQCUqSblwms_Ex0Sn3LQ
计算机网络的 89 个核心概念
参考文档
https://mp.weixin.qq/s/cmhqnqVtaj1P6o2cnjO4Og
https://mp.weixin.qq/s/s0FVNYL23zPNpqd3rq0L4Q
更多推荐
知识树沉淀总结—计算机网络
发布评论