网络分层
计算机网络主要就是讲计算机协议
网络模型有7层也有5层 一般来说都是讲5层
socket一般由四元组组成
源Ip 端口号 目的ip 端口号
同一个socket里有很多流 例如一个http长连接中有多次http请求 每次请求是一个流 一个http长连接底层也是靠socket连接
操作命令
ifconfig 用于显示和配置网络接口的信息,如 IP 地址、子网掩码、MAC 地址等
telnet 测试目标端口是否开放 telnet 192.168.1.2 8080
netstat 用于显示网络连接、路由表、网络接口统计等信息
- 显示所有 TCP 连接:
netstat -tulnp
- 显示路由表:
netstat -r
ping 用于测试与目标主机之间的网络连通性,通过发送 ICMP 回显请求包并等待响应来判断网络是否可达 ping www.baidu.com /127.0.0.1/localhost/192.168.1.1
这里说下127.0.0.1和localhost localhost是域名 通过查询配置会转换成127.0.0.1
127.0.0.1是回环地址 当网线断开 ping127.0.0.1也是连通 以为在网络层会判断是本机就不走真网卡了
ping 192.168.1.2这个是局域网ip地址 当网线断开时 无法连通
本地局域网 IP(如 192.168.1.2
)是主机通过物理网卡(如 Ethernet 或 Wi-Fi)连接到局域网时分配的地址。它依赖物理网络接口与其他设备通信,与回环地址(127.0.0.1
)有本质区别。
还有一个0.0.0.0 或者本机的局域网ip
- 含义:
0.0.0.0
是一个特殊的 IP 地址,它表示监听主机上的所有可用网络接口。无论客户端是通过本地回环接口(127.0.0.1
),还是通过主机的局域网 IP 地址(如192.168.1.100
)、公网 IP 地址来连接,只要端口号正确,都可以连接到监听该地址的服务。
监听 127.0.0.1
时,只有本地客户端可以连接
应用层
应用层就是进程与进程间通信 并且定义了相应的格式 用tcp协议实现的协议还处理了粘包拆包的问题
常见协议 http https ftp telnet dns ssh kcp
http 超文本传输协议
请求头部信息
方法有
get获取资源 一般从服务器上获取资源 请求参数在url之后 查询一般用get
post 传输实体主体 向服务器提交请求字段 请求提交的数据封装到请求体中
put修改指定url资源
patch局部修改url所在资源的数据
delete删除指定Url资源
head获取相应报文的头部
options询问服务器支持哪些方法
trace追踪路径
url就是请求路径
版本协议 http有1.0 1.1 2.0协议
1.0协议是短连接的 一次请求和回复后就断开连接
1.1版本的特点就是长连接 多个请求可以串行的用这个tcp连接
问题就是队头阻塞
1.1 有还有管道机制 同一个TCP连接里面,客户端可以同时发送多个请求 服务器还是顺序执行 还是有头部阻塞 默认不开启
2.0是多路复用二进制分帧 同一个连接并发处理多个请求 同个请求服务器可以分多次回复 但还是要客户端发请求 服务器可以对一个客户端请求发送多个响应 服务器向客户端推送资源无需客户端明确的请求
多个请求可以在一个tcp上同时发送 每个请求是同个stream 每个stream可以拆成多个frame
3.0使用了quic协议
http是无状态的连接 为了处理这个问题 每个请求都是独立的互不相关
session和cookie
引进了session和cookie
cookie和session都是保存用户的信息实现有状态
最大的区别是cookie保存在浏览器中 请求时发送整个cookie session是在服务器中的缓存 发送sessionId到浏览器中 请求时以cookie的形式发送给服务器
cookie最大允许4kb 一个站点最多20个
另外有一个token 令牌
是为了解决分布式 是用于验证身份 相当于把Session信息让客户端来保管而且无法伪造
用户登录进行身份认证,认证成功后服务器端生成Token返回给客户端;客户端接收到Token后保存在客户端(可保存在Cookie、LocalStorage、SessionStorage中);客户端再次请求服务器端时,将Token作为请求头放入Headers中;服务器端接收请求头中的Token,将用户参数按照既定规则再进行一次签名,两次签名若一致则认为成功,反之数据存在篡改请求失败。
cookie把账号密码一起发给服务器 token第一次发了账号密码 后面收到token后只发账号和token
session第一次发了账号密码 后续只发seesionid
响应头部信息
协议版本
状态码
200ok
204成功但没有资源返回
301永久性转移
302暂时重定向
304已缓存
400参数错误
401未授权
403没有权限
404没找到资源
405不支持该请求方法
500服务器内部错误
503服务器不可用
https是加密的http协议
HTTPS协议==HTTP协议+SSL/TLS协议,在HTTPS数据传输的过程中,需要用SSL/TLS对数据进行加密和解密
https在建立链接时是非对称加密,建立链接后是对称加密
1对称加密:加密解密用同一个密钥,被黑客拦截不安全
2非对称加密:公钥加密,私钥解密;公钥可以公开给别人进行加密,私钥永远在自己手里,非常安全,黑客拦截也没用
为了保证服务器给客户端的公钥是可靠的,服务器向第三方认证的机构CA申请证书,然后服务器再将公钥附在证书上传给客户端。客户端收到证书后,首先判断域名是否为目标域名,然后比对数字签名和使用摘要算法得出的信息是否正确(即验签)
操作系统上有ca证书的公钥,是被操作系统信任,所以无需传输,因此也不会被劫取。这意味着中间人是没有这个公钥的
1客户端生成第一随机数发送给服务器
2服务器收到后生成第二个随机数 并且将公钥发给ca ca用密钥对摘要加密 将证书发给服务器
服务器将证书和随机数发给客户端
3客户端用ca证书的公钥解密 得到服务器的公钥 并且生成第三随机数 用服务器的公钥加密发送给服务器 自己将三个随机数生成密钥 之后就用密钥传输
4服务器收到后 用私钥解密 得到第三随机数 将三个随机数生成密钥 用密钥传送
非对称加密原理
有两个关键因素 公钥和私钥 公钥是多人都可以拥有并且公开 私钥只有一个人拥有不公开的
假如用公钥加密 那么只有拥有私钥的人才能解密 保证了数据的加密
假如用私钥加密 拥有公钥的人都能解密 数据不加密 但保证了数据就是来自拥有私钥的人发送的 用来确认身份的(前提是公钥是真的情况下)
websocket
持久化 基于tcp 双向通信协议
WebSocket在建立握手时,数据是通过HTTP传输的。但是建立之后,在真正传输时候是不需要HTTP协议的 先用 HTTP 先进行三次握手,再向服务器请求升级为websocket 协议
.http存在的问题
http是一种无状态协议,每当一次会话完成后,服务端都不知道下一次的客户端是谁,需要每次知道对方是谁,才进行相应的响应,因此本身对于实时通讯就是一种极大的障碍
http协议采用一次请求,一次响应,每次请求和响应就携带有大量的header头,对于实时通讯来说,解析请求头也是需要一定的时间,因此,效率也更低下
最重要的是,需要客户端主动发,服务端被动发,也就是一次请求,一次响应,不能实现主动发送
实现了全双工 服务器也可以主动推消息 不用客户端请求
kcp
一般传输层用udp
相比于TCP,KCP以浪费10%20%的带宽代价,换取比TCP快30%40%的传输速度,并且最大延迟降低三倍的效果。
KCP为纯算法实现,不负责底层协议的收发,需要使用者自己定义下层数据包的发送方式,以callback的方式提供给KCP。KCP内部不会有任何的系统调用,就连时钟都需要外部传递进来
可靠传输一般都是靠确认机制 重传机制 序号重排 窗口
conv:会话编号,通信双方必须一致。
cmd:报文类型
IKCP_CMD_ACK 确认命令
IKCP_CMD_PUSH 数据推送命令
IKCP_CMD_WASK 接收窗口询问大小命令
IKCP_CMD_WINS 接收窗口大小告知命令
wnd: 己方可用接收窗口大小,接收窗口大小 - 接收队列大小
frg:segmen t分片。0,最后一个分片。3 2 1 0
sn:segment 报文的序列号。
ts:发送时间戳,用于计算RTO和RTT
una:待接收的序列号,其实确认号,表示该序列号之前的所有报文都收到了,可以删除
len:数据长度,DATA的长度
DATA: 用户数据
https://zhuanlan.zhihu.com/p/669460695
1 RTO(Retransmission TimeOut)
,重传超时时间。tcp x 2,kcp x 1.5,提高传输速度
2 TCP丢包时会全部重传从该包开始以后的数据,而KCP选择性重传,只重传真正丢失的数据包。
quic
一般传输层用udp
QUIC 协议中的三个核心特性:0-RTT 连接建立、无队头阻塞的多路复用、无歧义重传
快速UDP网络连接之QUIC协议介绍-优快云博客
kcp和quic和tcp
kcp和quic的传输层都是用udp quic更多是用到web的http3.0中
但是都是模仿tcp保证了数据的可靠性
都是有会话id 包确认机制 包重传 重传都是选择性重传 只重传丢失的包 都有滑动窗口(quic每个流一个滑动窗口)
超时重传中kcp是1.5倍
ssh
SSH是英文Secure Shell的简写形式。通过使用SSH,你可以把所有传输的数据进行加密,这样"中间人"这种攻击方式就不可能实现了,而且也能够防止DNS欺骗和IP欺骗。使用SSH,还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度
SSH提供两种认证方式:
-
password认证:客户端向服务器发出 password认证请求,将用户名和密码加密后发送给服务器;服务器将该信息解密后得到用户名和密码的明文,与设备上保存的用户名和密码进行比较,并返回认证成功或失败的消息。
-
publickey 认证:采用数字签名的方法来认证客户端。目前,设备上可以利用RSA和 DSA两种公共密钥算法实现数字签名。客户端发送包含用户名、公共密钥和公共密钥算法的 publickey 认证请求给服务器端。服务器对公钥进行合法性检查,如果不合法,则直接发送失败消息;否则,服务器利用数字签名对客户端进行认证,并返回认证成功或失败的消息
ftp
FTP 英文全称 File Transfer Protocol,中文全称 文件传输协议。提供交互式访问,基于TCP完成数据的传输
FTP采用C/S模型完成服务,一个FTP服务器可以为多个客户端提供服务。工作步骤如下:
1、服务器启动,等待接收客户端的请求,一般默认端口为tcp的21;
2、客户端与服务器建立控制tcp连接,该tcp连接用于后续交互ftp相关信息;
3、服务器与客户端建立连接,处理相应请求
socket
套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合
一般是4元组 源ip 端口号 目的ip 端口号 或者5元组 加多一个协议
序列化协议
- 序列化:将对象转换为字节序列的过程称为对象的序列化;
- 反序列化:将字节序列恢复为对象的过程称为对象的反序列化
protobuf json xml
xml是一种通用和轻量级的数据交换格式语言,是指可扩展标记语言(extensible markup language),以文本结构进行存储
Json是一种通用和轻量级的数据交换格式,也是以文本的结构进行存储,是一种简单的消息格式,全称为JavaScript Object Notation。Json作为数据包格式传输时具有更高的效率,这是因为Json不像xml那样需要有严格的闭合标签,这就让有效数据量与总数据包比有着显著的提升,从而减少同等数据流量的情况下网络的传输压力
Protobuf是Google开发的一种独立和轻量级的数据交换格式,以二进制结构进行存储,用于不同服务之间序列化数据。全称为Protocol Buffers,是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者序列化,可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式
tag记录编号和类型 当类型为0时 用可变长结构存储字段
优点
(1)二进制结构存储,效率高,序列化体积比Json和xml更小、更加灵活;
(2)格式规范,支持RPC;
(3)易于使用,开发人员可以按照一定的语法定义结构化的消息格式,然后送给命令行工具,工具将自动生成相关的类,可以支持JAVA、C++、Go等语言环境。通过这类类包含在项目当中,可以很轻松的调用相关方法来完成业务消息的序列化与反序列工作;
网络攻击
SQL注入
SQL 注入漏洞(SQL Injection)是 Web 开发中最常见的一种安全漏洞。SQL注入漏洞就是通过SQL参数替换形成特殊SQL操作。可以用它来从数据库获取敏感信息,或者利用数据库的特性执行添加用户,导出文件等一系列恶意操作,甚至有可能获取数据库乃至系统用户最高权限。
SQL防御方式
1.使用预处理 PreparedStatement。
2.使用正则表达式过滤掉字符中的特殊字符。
3.目前许多数据访问层框架,如IBatis,Hibernate等,都实现SQL预编译和参数绑定,攻击者的恶意SQL会被当做SQL的参数,而不是SQL命令被执行。
DoS攻击
DoS 是 Denial of Service 的简称,即拒绝服务,造成 DoS 的攻击行为被称为 DoS 攻击,其目的是使计算机或网络无法提供正常的服务。
DoS防御方式
1.验证码 暴力防御方式,用户体验差
2.限制请求频率 Yahoo算法,根据IP地址和Cookie等信息,可以计算客户端的请求频率并进行拦截
DDOS攻击
DDOS攻击全称为分布式拒绝服务攻击,DDOS是DOS攻击中的一种方法。是指击者利用大量机器对攻击目标发动大量的正常或非正常请求、耗尽目标主机资源或网络资源,从而使被攻击的主机不能为合法用户提供服务。
DDOS防御方式
防御方式与DOS类似
传输层
实现网络上主机进程之间的通信 有可靠和不可靠传输
协议有tcp和udp
由于以太网EthernetII最大的数据帧是1518Bytes这样,刨去以太网帧的帧头(DMAC目的MAC地址48bits=6Bytes+SMAC源MAC地址48bits=6Bytes+Type域2Bytes)14Bytes和帧尾CRC校验部分4Bytes那么剩下承载上层协议的地方也就是Data域最大就只能有1500Bytes这个值我们就把它称之为MTU。
链路层帧的大小 1500(不包括帧头、帧尾)
UDP 包的大小就应该是 1500 - IP头(20) - UDP头(8) = 1472(Bytes)
TCP 包的大小就应该是 1500 - IP头(20) - TCP头(20) = 1460 (Bytes)
TCP
tcp是面向字节流的 基本单位是报文段 可靠传输 首部开销20个字节 有拥塞控制和流量控制 支持点对点通信 全双工
URG 表明有紧急数据不用再缓存中排队
ACK 确认号有效 连接建立后所有传送的报文段ACK都是1
PSH 直接发送给应用进程 不用等缓存区填满
RST 释放连接重新建立
SYN 连接请求
FIN 释放连接
窗口大小 控制发送端的滑动窗口大小
tcp建立连接需要三次握手 断开连接需要四次挥手
三次握手
第一次 syn为1 seq为随机第一个字节的序号 客户端进入syn_sent状态
第二次 服务器如果再listen状态下就能收到确认信息 同时发送 syn为1 ACK为1 seq为随机第一个字节的序号 ack表示希望下一个数据的第一个字节希望是a+1 服务器进入syn_recd状态
第三次 客户端收到后 发送ack为1 seq=a+1 ack=b+1 客户端进入established状态
服务器收到后也进入established状态
三次握手是为了保证客户端和服务器都确认 对方和自己的接收和发送都是每问题的
第一次 客户端知道自己的发送没问题 第二次服务器知道客户端的发送 自己的接收 自己的发送没问题 第三次客户端知道自己的接收 服务器的接收 发送没问题 然后服务器也知道客户端的接收没问题
挥手过程中 第三次可以携带数据
四次挥手
第一次 客户端发送fin为1 后进入fin_wait_1的状态 客户端本身就不继续发送正常的数据了
第二次 服务器发送ack为1后进入 close_wait 服务器就确认客户端不能继续发送正常的数据了
同时服务器还可以继续发送数据 客户端进入fin_wait_2的状态
第三次服务器发送fin为1 进入last_ack状态 服务器本身就不再发送数据了
第四次 客户端收到fin后 进入time_wait状态 发送ack为1的确认报文段 time_wait状态经历2msl后进入closed 服务器收到确认后也进入closed
time_wait是为了防止ack报文丢失 导致服务器一直无法关闭
MSL是Maximum Segment Lifetime的英文缩写,可译为“最长报文段寿命”,它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。
tcp有粘包和拆包的现象
因为流协议是没有界限的一串数据 根据tcp缓冲区的大小分包
解决办法
固定数据的大小 不够能用空位补全
加特殊分割符
加消息头 消息头大小固定 表明内容的大小
tcp保证可靠性传输
应答机制和累计确认 数据包校验 超时重传 重排序 流量控制和拥塞控制
应答机制和数据包校验
就是每个包都有一个编号 收到之后发送ack确认收到这个包
累计确认
发送确认收到了5 那么说明 1234包都已经收到了 如果多次收到某个包的确认则说明下一个包丢失了
超时重传
每个包发送都会有定时 超时一定时间没有收到确认就是重传 重传会把丢失的包重传
超时时间rto
和后面的包都重传 如果开启了sack 则重传丢失的包
快速重传
发了3次ack某个包 就要重传这个包了
一般来说重传这个包和后面的包都重传 如果开启了sack 则重传丢失的包
流量控制
是双方都有缓存空间防止数据过多溢出
拥塞控制
是网络中是否拥塞
流量控制和拥塞控制都是通过滑动窗口的大小来调整 滑动窗口大小就是一次性能发送数据的大小
拥塞控制四种算法
慢开始
拥塞避免
快重传
快恢复
一个关键的值 ssthresh
传输轮次就是收到ack包的次数
慢开始
窗口大小按2的倍数指数变大 一开始从1开始
拥塞避免
进入到ssthresh时 窗口大小加1增大
发生超时重传时 sshthresh变成此时窗口大小的2分之一 重新慢开始
快重传
发生重新确认包时(3次)迅速重传丢失的包
快恢复
sshthresh变成此时窗口大小的2分之一 从窗口大小的2分之一开始拥塞避免
UDP
udp是面向报文的 无连接的 不可靠的 支持一对一、一对多、多对一和多对多的交互通信
tcp和udp的区别
网络层
协议有 ip arp rarp dhcp nat icmp
arp实现ip地址获取mac地址的协议
rarp实现硬件地址到ip地址的转换
dhcp可以使客户机自动获得服务器分配的ip地址和子网掩码
icmp控制报文协议 把错误信息封包传回主机 差错报告报文和询问报文
nat 内网ip转外网ip
IP
实现网络主机之间通信 实现网络地址和物理地址的转换 路由算法选择最设当的路径
子网掩码
子网掩码(subnet mask)又叫网络掩码、地址掩码、子网络遮罩,它是一种用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。
子网掩码不能单独存在,它必须结合IP地址一起使用。子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分。
物理设备有路由器 路由器是更高交换机,作用在网络层,能识别ip地址 网关 当两个主机的网段不同时,之间的信息传输就要先经过对方的网关 一般由路由器作为网关 路由器一段可以是公网ip 另一端是内网ip
DNS解析
ARP协议
RARP协议
DHCP
NAT
ICMP
IGMP
数据链路层
实现相邻结点与结点之间的传输 通过差错控制 流量控制使有差错的物理线路变成无差错的数据链路
封装成帧 把网络层数据报加头和尾 帧头有源mac和目的mac
透明传输
差错控制 有差错就丢弃
流量控制
物理设备 交换机
交换机连接的主机可以在同个网段或者不在同个网段,但都在同个内网,交换机每个端口是一个冲突域,即每个端口可以同时发数据,由交换机缓存转发,作用在链路层 只能识别mac地址
物理层
实现计算机结点之间比特流的透明传输 是物理传输介质和物理设备的级别
物理设备有中继器(扩大信号) 集线器
中继器,集线器作用在物理层,集线器下连接的主机都是在同个网段下的,全部主机都在同个冲突域下