netstat常用选项
# netstat -a # 列出所有端口
# netstat -at # 列出所有TCP端口
# netstat -au # 列出所有UDP端口
# netstat -l # 只显示监听端口
# netstat -lt # 显示监听TCP端口
# netstat -s # 显示所有端口的统计信息
# netstat -p # 显示PID和进程名称
# netstat -r # 显示核心路由信息
# netstat -n # 不把地址转换成网络服务名称(而是以网络地址显示)
# netstat -o # 显示拥有的与每个连接关联的进程ID
查看端口是否被占用
netstat -ano windows中的命令
netstat -anp linux中的命令
自定制应用层协议
结构化数据传输
定义结构体来表示我们需要交互的信息,发送数据时将这个结构体按照一个规则转换成字符串,
接收到数据的时候再按照相同的规则把字符串转化回结构体,这个过程叫做 "序列化" 和 "反序列化"。
google protobuf 序列化库
网络版计算器:客户端传递数字和运算符到服务器端,服务器端进行计算并将结果返回。
可以将数据的size放在首部,这样一开始就可以解析出来结构体中要传输的数据的大小。
sudo yum install lrzsz 打开windows下的目录
vim /etc/sudoers 添加临时用户为sudo权限
html:格式化了字符串,这样做的目的是为了方便解析。 (被设计用来显示数据) 标签化的字符串
xml:被设计用来传输和存储数据。 层次分明,方便解析,可读性强,但是占用空间大。
json:来源于javascript的一个对象,后改名为typescript(javascript的超级版)
URL(统一资源定位符) 平时俗称的"网址"
eg: http://user:[email protected]:80/dir/index.htm?uid=1#ch1
协议方案名(协议名)
登录信息(认证):现在已经很少给出了
@间隔
服务器ip地址(域名)
服务端口号(80):可以不显示给出
带层次的文件路径(相对根路径) web根目录
?间隔
查询字符串:用&间隔 =是间隔值之间的分隔符
查询词(query=菜鸟教程) 实际上发送请求的时候转义了这些字符,不过在html显示的时候又转义了。
片段标识符:指定到本次打开的网页的某个标签处(或者说跳转到网页的某个位置处)
长度是受限的(以前是1024字节) #片段
urlencode和urldecode 编码与解码
像 / ? : 等这样的字符, 已经被url当做特殊意义理解了. 因此这些字符不能随意出现.比如, 某个参数(query_string)中需要带有这些特殊字符,
就必须先对特殊字符进行转义。
转义的规则如下:
将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式
+转义成 %2B(每4位解析成一个字符,最后拼接) % + 16进制数字拼接
http(超文本传输协议)
明文传输,可以直接打开观看请求与回复信息。 基于TCP协议
由于是文本格式,很容易被html格式的数据
简单的HTTP协议本身并不存在安全性问题,因此协议本身几乎不会成为攻击的对象。应用在HTTP协议的服务器和客户端,以及
运行在服务器上的Web应用等资源才是真正的攻击目标。
针对Web应用的攻击模式
1.主动攻击
攻击者直接访问Web应用,把攻击代码传入的攻击模式。(实际上攻击的是服务器上的资源)
SQL注入攻击和OS命令注入攻击
2.被动攻击
http与https的区别
https是由http与SSL协议构建的可以进行加密传输、身份认证的网络协议,比http协议更加的安全。
1、使用的端口号不一样,80 443
2、http连接时无状态的,https是由http与SSL协议构建的可以进行加密传输、身份认证的网络协议
3、http是明文传输,https是具有安全性的ssl加密传输协议
4、https协议需要到CA申请证书,一般免费证书较少,因此需要支付一定的费用。
request:分了四个部分
首行(以空格间隔) (请求行)
1、请求方法
POST提交数据在正文 (服务器给客户端传数据)
GET提交的数据在首行的URL中(QUERY_STRING:查询字符串) (想从服务器上获取数据)
PUT修改服务器中的某个数据(上传资源)
DELETE删除服务器中的某个数据
HEAD获取报文头部
OPTIONS询问支持哪些方法
2、URL
3、HTTP协议版本号(\r\n结尾)
\r回车符,回到行首
\n换行符,回到下一行
协议头
header
每行关键信息以换行符间隔(\r\n)
每条关键信息都是一个键值对:冒号加空格间隔 (key: value\r\n)
Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
User-Agent:声明硬件信息、操作系统信息以及浏览器版本信息等。 (可以分析出是从手机端还是PC端访问网页)
适应不同的访问对象
Connection: keep-alive(保活计时器) 长链接
Content-Length: 27 正文长度(一次性发送正文长度) Body的长度
Content-Type: 数据类型(text/html等) Content-Type: text/html; charset = UTF-8
Referer: http://www.baidu.com 识别当前页面是从(百度)哪个页面跳转过来的;
注意:运营商可以修改这里的内容(运营商移动电信联通等劫持) 广告投放
https:加密http,默认端口号是443。这时运营商就不容易去修改Referer后面的内容了。
Cookie
保存一些加密的会话信息和认证信息(一个Cookie文件最大不超过4K,一个浏览器中最多有300个Cookie文件)
用于在客户端存储少量信息. 通常用于实现会话(session)的功能; 也会保存浏览历史记录、域名等等。
避免重复性的登录 POST方法正文部分就有登录信息 文件小的话就避免了占用更多的网络带宽。
PHPSESSID保存了会话id。
header部分一共有多少行,这个不能直接确定,而是通过header最后的空行作为header的结束标记。
空行
请求头与正文之间的间隔(相当于间隔了两个换行)
正文
body (&间隔 间隔值用=隔开)
body的数据格式取决于Content-Type,往往是一个text/html格式,数据长度取决于Content-Length,body的结束。
response:分了四个部分
首行(状态行)
1.协议版本
2.服务端返回的状态码
1xx描述处理(信息性状态码)
接收的请求正在处理
A->B 发送报头及请求行,B收到报文后解析,然后返回1XX的状态码,如果解析没有问题,继续接收正文。
2xx正确处理
204表明请求结果被正确处理,但是响应信息中没有响应正文
206可以拿取局部信息 客户端对服务器进行了范围请求,并且服务器成功执行了这部分的GET请求,响应报文中包含
由Content-Range指定的实体内容范围。
3xx重定向(跳转到另一个URL)
301永久重定向
302临时重定向 Location字段
几乎所有的浏览器都会把POST改成GET,并删除请求报文内的主体,之后请求会自动再次发送。
301 302标准是禁止将POST方法改变成GET方法的,但是实际使用中大家都会这样做。
307 会按照浏览器标准,不会从POST变成GET。
4xx客户端错误
400Bad Request 请求报文中存在语法错误
403Forbidden 权限不够就有可能出现
404Not Found
418 I'm a teapot茶壶 彩蛋
5XX服务端错误
500 Internal Server Error
可能是服务器本身存在的BUG
服务器没有空余资源,再去请求创建线程,就会因压力太大而Down掉
503 Server Unavailable
该状态码表明服务器目前处于超负载或正在进行停机维护状态,目前无法请求处理。这种情况下,最好写入
Retry-After首部字段在返回给客户端 eg:抢票(服务器正忙,请稍后再试)
3.对状态码的描述
协议头
html展示效果 每一行是一个键值对,键 与 值之间使用:隔开。
Location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问。 临时重定向时会有这个字段,表示下一个访问的URL。
Set-Cookie字段决定了客户端应该保存哪些Cookie。实际上多个该字段最终会合并在一起,存放在客户端中。
expires字段表示信息的存放时间。 实际上cookie是按照域名维度进行存储的。
Transfer-Encoding: chunked(一段一段去发送,每段数据有多长,遇到0正文结束) 有个16进制的数字
空行
header的结束标记,明确边界,有效规避粘包。
正文
body (&间隔 间隔值用=隔开)
body的数据格式取决于Content-Type,往往是一个html格式,数据长度取决于Content-Length,
GET与POST的区别
POST提交数据在正文
在header中可能有content-type 以及 content-length字段
GET提交的数据在首行的URL中,没有正文。
resquest与response
一个请求,一个响应,然后断开连接。(网页的访问)
Fiddler
浏览器先发送请求到Fiddler,然后Fiddler发送到Http服务器,响应的过程与之相反。
相当于Fiddler就是一个中转站。
Browser <-> Fiddler <-> Website
<>图标后面的请求就是我们的请求。点击Raw(纯文本格式显示)可以看到请求或者响应信息。正文有可能是乱码的,需要点击解码。
查看Body字段的大小也可以看到是我们的请求。
Fiddler过滤设置过程:
打开fiddler->Tools->Fiddler Options->HTTPS>...from remote clients only,勾选这个选项就可以了。
...from all processes :抓所有的请求; ...from browsers only :只抓浏览器的请求;
...from non-browsers only :只抓非浏览器的请求; ...from remote clients only:只抓远程客户端请求
传输层
在网上如何标识一个通信
sip sport dip dport proto (五元组)
localhost: 127.0.0.1
ps aux 查看pid
pidof sshd 查看进程的id,只显示pid。
快递的打包过程 (封装)
DNS
C:\Windows\System32\drivers\etc\hosts windows下的hosts文件
cat /etc/hosts
某个组织管理所有的IP和域名的映射关系。
先去电脑上的hosts文件查找DNS映射关系,如果没有找到,那么发给DNS解析器,查找本地的DNS服务器,在缓存中查找,
如果还没有找到,那么发送到根域名服务器,然后根如果有,则会响应,如果没有的话下发给可能知道的下级DNS服务器,直到找到。
.com->baidu.com
浏览器中输入url后,发生的事情
从通信协议底层入手
1.域名解析
查本地hosts文件->浏览器的缓存是否有该域名->DNS服务器
2.HTTP协议相关内容
请求与响应的过程
按照HTTP协议格式构造HTTP请求字符串
3.TCP协议相关内容
创建TCP客户端三次握手
4.IP协议路由选择过程
从应用角度(每个服务器模块都是一个集群)
CDN服务器(运营商架设的缓存服务器,能提高访问速度) 一般会缓存静态资源
1.请求到达了CDN服务器,如果命中缓存就直接返回,否则继续转发;
2.请求到达了百度机房的入口服务器(网关),如果命中缓存就直接返回,否则继续转发;扮演了"反向代理"角色
3.请求转发到应用服务器(首页、贴吧、搜索),应用服务器动态计算生成结果;
静态资源(一直存在,不会变化,比如百度首页)和动态资源(动态计算,比如百度搜索结果页)
访问百度的文件存储服务器
4.分词服务器、检索服务器(触发:倒排索引,根据词找到文档ID,过滤,点击率预估,排序)、
用户服务器、物料服务器(内存中存储)
5.渲染html
域名解析服务器:分布式存储结构
1.分摊压力;
2.防备安全隐患;(如果一台机器挂掉了,不会造成太严重的后果)
3.速度快
容灾
一级域名:企业名(.com .cn .net .edu .org)
二级域名:公司名(baidu)
三级域名:公司内部组织(tieba)
eg: www.tieba.baidu.com
CDN缓存
代理
正向代理
eg:代购 直接发请求
反向代理
eg:一次性代购很多东西 直接发响应 (缓存了很多)
:广域网中的代理
负载均衡:局域网中的代理
看视频是有缓冲的,即使丢包了也会重传。
ICMP协议(只能搭配IPv4)
诊断网络的状况
通知出错原因
实现ping命令
类型0 回送应答
类型8 回送请求
NAPT转换表
NAT技术的缺陷
1.无法从NAT外部向内部服务器建立连接;
2.转换表的生成和销毁都需要额外开销;
3.通信过程中一旦NAT设备异常,即使存在设备,所有的TCP连接都会断开。
代理服务器工作在应用层,由程序员编写的应用程序。
tcpdump
PostMan