【Linux】应用层协议

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

你可能感兴趣的:(Linux)