HTTP详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTP详解相关的知识,希望对你有一定的参考价值。

一、socket介绍
二、TCP FSM有限状态机
三、http相关概念
四、http服务器程序

一、socket介绍
1.socket:
    C/S
        Client:发起应用请求的程序
        Server:响应请求(提供服务)的程序
            LISTEN:Socket
            c/s双方都打开了一个套接字:已经连接的套接字
    
    应用层               应用层
    =======        =======    
    传输层:    传输层:
    网络层:    网络层:
    物理层:    物理层:
    ===================            
        X            y/server
    
    x层的进程想要和y通信,-->封装传输层首部(IP:sort)-->网络层头部->物理层首部
    y接收到后:物理层解封装-->
        1.传输层头部:
            TCP首部
                d端口,s端口,sequence number,ack number,checksum ,urgent pointer,Payload(data)
                window //窗口大小,利用滑动窗口告诉对方我的缓冲区大小,窗口大小16bit
                    //发送缓冲和接受缓冲,过大则进行退避算法
            UDP首部:
                源端口,目标端口,长度,udp校验和,数据
            裸套接字:直接使用ip发送数据包,不经过tcp/udp
                raw-socket
        2.网络层:    
            sip,dip
                
2.传输层协议:tcp,udp,sctp            
    tcp:transport control protocol
        面向连接的协议:双方通信之前需要事先建立虚链路        
    udp:user datagram protocol
        无连接的协议:无需建立虚链路
    
3.TCP滑动窗口:http://blog.csdn.net/lee576/article/details/1957003
    双方流量控制,协商通信双方的通信节奏
    滑动窗口,可以理解成接收端所能提供的缓冲区大小
  A—————C—————B   
  如上图,A与B之间建立TCP连接,滑动窗口实现有两个作用:   
    
  1.B端来不及处理接收数据(控制不同速率主机间的同步),这时,A通过B端通知的接收窗口而减缓数据的发送。   
  2.B端来得及处理接收数据,但是在A与B之间某处如C,使得AB之间的整体带宽性能较差,
    此时,A端根据拥塞处理策略(慢启动,加倍递减和缓慢增加)来更新窗口,以决定数据的发送。    
    
4.Web Service:
    应用层:http,https
        实现某类具体应用;
    传输层协议:TCP,UDP,SCTP
    IANA:端口分配
        0-1023:永久分配,特权端口;只有管理员启用或关闭
                53:tcp named 区域传送
                53:udp named 解析使用
        1024-32768:注册端口,但要求不是特别严格,分配给程序注册为某应用使用;3306/tcp:mysql,
        32768--60000:客户端程序随机使用的端口,动态端口,或私有端口 //范围定义在/proc/sys/net/ipv4/ip_local_port_range;
            /proc/sys/net/ipv4/ip_local_port_range;定义端口分配

技术分享图片   
    BSD Socket:IPC的一种实现,允许位于不同主机(也可以是同一主机)上的进程之间进行通信
        UNIX Domain Socket有SOCK_DGRAM或SOCK_STREAM两种工作模式,类似于UDP和TCP,但是面向消息的UNIX Domain Socket也是可靠的,消息既不会丢失也不会顺序错乱。
            :进程间通信{远程主机之间}的实现
        Socket API(封装了内核中的socket通信相关的系统调用)
        
        
二、TCP FSM有限状态机
1.图解:Tcp socket套接字函数:TCP_SOCKET监听
技术分享图片 TCP服务器:bind()在套接字上ip:port,监听,准备随时接受accept()客户端请求
        
    TCP三次握手:
        A<====>B[s]
        1.A发送请求B,这是A==>B的虚链路
        2.B回应A并请求A建立连接,这是B==>A的虚链路
        3.客户端确认说可以接受了,并发送请求,就可以开始通信了
    client调用write()发送请求内容,S:read()读出内容,处理请求
    
    TCP四次断开 //TCP FSM有限状态机
        一般是client发起结束请求
        A请求S断开,进入FIN_WAIT1,
        S收到请求,恢复确认,S进入ClOSE_WAIT,C进入FIN_WAIT2
        S发送其他剩余的包,进入LAST_ACK,C进入TIME_WAIT
        C确认接受完毕,发送确认给S,进入CLOSED
        
        C:请求断开-->FIN_WAIT1,
            S收到请求,回应确认,S-->CLOSE_WAIT,C--->FIN_WAIT2
            S发送剩下的包:S--->LAST_ACK,C收到确认信息,C-->TIME_WAIT
        C:发送确认,确认接收完毕,发送给s,S:-->CLOSED
    C:请求断开,接受确认信息,最后发送确认包
    S:响应请求,发送剩下的包,
            
TCP FSM:

CLOSED,LISTEN,SYN_SENT,SYN_RECV,ESATBLISHED,FIN_WAIT1,CLOSE_WAIT,

FIN_WAIT2,LAST_ACK,TIME_WAIT,CLOSED
    四次断开:
        C:FIN_WAIT1,FIN_WAIT2,TIME_WAIT
        S:CLOSED_WAIT,LAST_ACK,CLOSED
    SYN_SEND:c发送链接请求
    SYN_RECV:S收到请求
    ESTABLISHED:建立链接

TCP协议的特性:有限状态机”(Finite State Machine,FSM)“
    建立链接:三次握手
        将数据打包切割分段;数据小于MTU,每个包校验和(CRC32)
        确认、重传及超时;
        排序 //发送的时候是分开传送的,有序列号
        流量控制:滑动窗口算法
        拥塞控制:慢启动和拥塞避免算法
注:TCP FSM会在下一篇文章中详细解释    
    
2.Socket Type:
    SOCK_STREAM:TCP套接字
    SOCK_DGRAM:UDP套接字
    SOCK_RAW:raw套接字
    
    根据套接字所使用的地址格式:Socket Domain
        AF_INET:address family ,IPv4
        AF_INET6:IPv6
        AF_UNIX:同一主机上的不同进程间基于socket套接字通信使用的一种地址,
                :一个进程向一个文件中写,一个进程读
                :默认套接字通信需要封装,解封装到传输层,unix socket可以让服务端监听在内存上的一个文件上,任何一个进程可以通过读取该文件获取数据
                :也成为UNIX_SOCKET
    
3.HTTP:hyper text transfer protocol,应用层协议,80/tcp,文本协议
    超文本:用html语言开发的文本
    html:hyper text mark language,编程语言,超文本标记语言
    
    格式:

<html>
     <head>
       <title> TITILE </title>
     </head>
     <body>
       <h1>  </h1>
      <p> jdjsfidsf <a href="http://www.mt.com/"> ..</p>
     </body>
</html>

    CSS:cascading style sheet //定义网页的样式 ,层叠样式表
            css和xml都是用来标记html样式的语言
    js:javascript,客户端脚本,
    AJAX:“Asynchronous Javascript And XML”(异步JavaScript和XML)是指一种创建交互式网页应用的网页开发技术
    
    协议版本:http/0.9真正出现的
        http/1.0:cache,MIME,method
        http/1.1:增强了缓存功能
            spdy:google开源项目
        http/2.0
        
        
        MIME:multipurpose internet Mail Extesion
            早期是在SMPT中实现的
        method:请求方法定义,    
            GET,POST,HEAD,PUT,DELETE,TRACE,OPTIONS
    工作模式:
        http请求报文:http request
        http响应报文:http response
        
    Web资源:web resource
        静态资源(无需服务端做出额外处理):jpg,png,gif,html,txt,js,css,mp3,avi
        动态资源(服务端通过执行程序[js]和服务器端脚本(asp,php)
        注意:一个页面中展示的资源可能有多个,每个资源都需要单独请求
            加速机制:多线程,静态资源缓存[或者不经常发生改变的resource]到本地浏览器
            
        资源的标识机制:URL
            Uniform Resource Locator:用于描述服务器某特定资源的位置
                例如:http://www.sina.com.cn/index.html
                    Scheme:http/ftp/https等协议
                    Server[:port]
                    [/Path/to/some_resource]
                Schema://Server[:port]/[path/to/some_resource]
                
                
三、http相关概念
1、一次完整的http请求处理过程
        1.建立和处理链接,接受请求或者拒绝请求
        2.接受用户请求;接受来自于网络上的主机请求报文中对某特定资源的一次请求过程;
            //每一个请求都要三次握手,四次断开,每个资源都要请求一次
            URL:确定并区分请求的目标
        3.处理请求:对请求报文进行解析,获取客户端请求的方法等相关信息
        4.访问资源;获取请求报文中请求的资源
        5.构建响应报文
        6.发送响应报文
        7.记录日志
    S:响应进程通过systemctl call加载目标文件,内核空间(获取数据)-->用户空间,构建响应报文{添加响应报文首部}-->发送响应报文(再次进入内核,封装传输层,ip层等首部)
        用户空间(进程system call)-->内核(加载文件)-->用户空间(封装响应报文)-->

2、接受请求的模型:
并发访问响应模型:
    单进程I/O模型;启动一个进程处理用户请求,一次只能处理一个请求,多个请求被串行响应
    多进程I/O结构:一个客户端可以同时发送多个请求,每个请求S对应一个进程响应
                :并发启动多个进程,每个进程响应一个请求
    复用I/O结构:一个进程响应n个请求;
        多线程模式:一个进程有n个线程,每个线程响应一个请求 //效果有限,因为linux对线程的支持不是很好
        事件驱动(event-driven):一个进程直接n个请求 //资源满足进程所需时,通告,内置多个处理机制,或者处理流来针对多个进程
    复用的多进程I/O结构:启动m个进程,每个进程生成n个线程
        响应请求的数量:m*n
处理请求:分析请求报文的http报文首部
    http协议:
        http请求报文
        http响应报文
                
    请求报文首部的格式:
        method,URL,Version
        HEADERS;[name;value]
        request body
访问资源:获取请求报文中请求的资源
    web服务器:负责向请求者提供对方请求的静态资源,或动态资源运行生成的结果
        :这些资源通常放在本地文件系统的某路径下,此路径称为"DocumentRoot"
    web服务器的资源路径映射方式:
        1.DocumentRoot
        2.alias
        3.虚拟主机的DocumentRoot
        4.用户家目录的DocumnetRoot
http请求的连接模式
    保持连接(长链接):keep-alive
        //复用双向的虚链路,
        //建立连接3次: 1:建立c到s的虚链接,2:建立s到c的虚链接
        //断开4次:1:断开c到s的链接,2:s回复确认断开,3:s断开到c的链接
        //一个页面有n个资源,每个资源请求,都要3链接,4次断开?
    非保持连接(短链接):
        需要多次建立和断开链接
    假如一个用户长期不断开:1.设置链路超时时间,2:限制访问文件个数

四、http服务器程序
    linux
        httpd(apache)
        nginx
        lighttpd 轻量级  
        //只能处理静态内容
    
    应用程序服务器
        IIS //可以处理动态内容,.net
        tomcat:.jsp
        
    www.netcraft.com    //web程序的应用服务器做排名
    httpd的安装和使用:
        ASF:apache software foundation  //有众多项目
            httpd,tomcat,hadoop,openoffice
            //http://www.apache.org/index.html#projects-list
    httpd.apache.org
        a patchy server= apache一个充满补丁的服务器
        //后期由众多软件工作者,自行维护
            
           

本文出自 “黑马腾空” 博客,请务必保留此出处http://hmtk520.blog.51cto.com/12595610/1984111

以上是关于HTTP详解的主要内容,如果未能解决你的问题,请参考以下文章

HTTP协议详解

HTTP协议详解

二、HTTP Content-Type详解

http协议详解

HTTP协议详解

一篇文章带你详解 HTTP 协议之报文首部及字段详解(中)