zoukankan      html  css  js  c++  java
  • 请求http页面的相关过程

         http请求从TCP建立三次握手后进行,客户端按照规定的格式向服务器发送http请求,服务器在接收到这个请求之后,首先要对其进行解析,发掘出客户端所需要的相关资源,然后经过相应的业务逻辑处理,找到这个相应的资源,并将它以特定的形式返回给客户端。注意:不论是请求还是响应他都按照http协议的相关格式来进行,那都是比较通用的。

    http的请求格式

      http的请求格式主要包括这几部分:请求行、请求头、空行、消息体。具体结构如下图所示:

    请求行:是指请求中的第一行,它主要有3部分构成:GET、POST等方法名,请求资源的URI,所用http的版本号。

     请求头中的信息:有和缓存相关的信息和客户端身份(user-Agent)的信息。

    消息体:是指客户端向服务器请求的数据资源,这部分数据不是每个请求所必有得。

    http的响应格式

     http的请求格式主要包括这几部分:响应行、响应头、空行、消息体。具体结构如下图所示:

    响应行:它主要包含三部分内容:所使用的http版本号、状态码及状态说明。

    响应头:响应头是服务器传递给客户端用于说明服务器的一些信息,以及将来继续访问该资源时的策略。

    消息体:是指服务器向客户端回应的html文件,或者是其他形式的内容,如视频文件、图片等。

    Socket

    http页面请求的这一部分内容与Socket编程紧密相关,又称之为网络编程,网络协议通过一个叫做socket的对象抽象出来,socket可以建立网络连接,读数据,写数据。socket模块定义了一些常量参数,用来指定socket的的地址族、socket的类型、以及支持的TCP/IP协议。

    socket.socket([family[, type[, proto]]]):根据指定的地址族和套接字类型、协议编号(默认为0)来创建套接字对象。AF_INET对应的IPV4, AF_INET6对应的IPV6。现在最常用的是IPV4协议。具体的参数分配如下图:

    服务器端的编程(ser:           

    Socket   :制定期望的通讯协议类型。AF_INET IPV4,现在使用最多的。SOCK_STREAM :流式套接字。

    Bind() ip: port:给套接口分配一个本地协议地址,对于TCP,调用函数bind可以制定一个端口号,用于标识某个计算机上的某个进程,它还可以指定一个IP地址

    Listen:仅被TCP服务器调用,它是一个将调用connect发起连接的客户套接口,它指示内核指向此套接口的连接请求。该函数在accpect之前被调用。对于监听套接口,内核必须维护连个队列:未完成连接队列和已完成连接队列的状态。

    Accept:从已完成连接队列头返回下一个已完成的连接,如果已完成的连接队列为空,则进入睡眠状态。如果accept执行成功,则代表与客户连接成功

    Recv/read:接收客户端发来的信息。

    Send/write:给客户端返回一个ok;

    Close:关闭连接。

      

    客户端cli:

    Socket:制定期望的通讯协议类型。AF_INET IPV4,现在使用最多的。SOCK_STREAM :流式套接字。

    Connect:建立一个与服务器的链接。客户端在调用connect之前不必再调用bind,如果是tcp套接口的话,函数connect激发TCP的三次握手过程,且仅在连接建立成或错误时返回

    Send:给客户端发送信息。只能说明成功地将数据写入发送缓冲区内,至于是否到达还不一定。

    Recv:接收客户端发过来的ok.

    Close:执行si'ci'hui'shou

    Getsocknamegetpeername返回与套接口有关的本地协议地址。Getsockname可用来获取某套接口的地址族。在不调用bind的客户机上,connect成功返回后,Getsocknam返回内核分配给此连接的本地端口号和IP地址。

    三次握手

         最初始客户机和服务器的Tcp进程他们都处于CLOSED状态,首先是B的TCP服务器进程先创建了传输控制块TCB,准备接受客户端的连接请求,然后B服务器进程端就处于LISTEN状态,等待客户端的连接请求。然后A的TCP客户进程也是首先创建了一个传输控制模块,然后向B发出连接请求报文段,报文段的首部同步位SYN=1,同时给自己设定一个初始量S,此时客户进程进入一个SEND状态即就是同步已发送状态。接着,B接收到A发出的连接请求以后, 同意连接建立,则需要向A发送一个确认。即把SYN和ACK都置为1,确认号为ack=S+1,同时还应发送一个自己的初始值假定为n,此时B进入同步收到状态。最后客户机A收到B的确认后,还应向B发出确认,将ACK置为1,另外将ack置为n+1,然后A将进入ESTABLISHED已建立连接状态。在B收到A的确认后,也进入ESTABLISHED状态。如下图所示:

     

    四次挥手

            A进程先向TCP发出一个连接释放报文段,并停止再发送数据,主动关闭TCP连接,需要将终止控制位FIN置为1,并设置它的初始值U,这时A进入终止等待1状态,等待B的确认。B收到链接释放报文段后立即发出确认,确认号ack=U+1,例外设置一个自己的初始值v,然后B就进入CLOSE-WAIT状态。当tcp通知高层应用程序后,然后AB之间的连接就释放了,但是此时TCp处于半关闭状态,即AB之间的连接释放了,但是B还可以向A发送数据,A收到B的确认后就进入终止等待2状态,等待B发出的连接释放报文段。假设B发出连接释放报文段,则要将终止控制位FIN置为1,同时发出确认号ack=u+1,还要再设置一个自己的初始值为W,然后B就进入了最后确认状态LAST-ACK,等待A的确认;A收到B的链接释放报文段后,向B发出确认,将ACK置为1,确认号置为W+1,然后A就进入TIME-WAIT时间等待状态。,当A等待上2MSL最长报文段寿命后,即4S进入CLOSED状态,才能开始下一个新连接的建立。

  • 相关阅读:
    document.getElementById("mytxt").style.left=""style.left在IE的FF中注意
    asp.net 用户控件中 使用相对路径的解决方法 图片路径问题(用户控件、图片路径) ,ResolveUrl
    探索 Block (一) (手把手讲解Block 底层实现原理)
    iOS 多线程开发 (概念与API简介)
    iOS 性能小点
    iOS runtime (二)(runtime学习之AutoCoding源码分析)
    探索 NSRunLoop (二)(NSRunLoop 自己动手实现SimpleRunLoop)
    iOS NSNotificationCenter (自己实现一个通知中心XMCNotificationCenter)
    iOS runtime (三)(runtime学习之YYModel源码分析)
    iOS runtime(一)(runtime 分析理解)
  • 原文地址:https://www.cnblogs.com/xiamengge/p/7184478.html
Copyright © 2011-2022 走看看