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

Getsockname和getpeername返回与套接口有关的本地协议地址。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通知高层应用程序后,然后A和B之间的连接就释放了,但是此时TCp处于半关闭状态,即A到B之间的连接释放了,但是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状态,才能开始下一个新连接的建立。

请求http页面的相关过程的更多相关文章

  1. HTTP 错误 500.19 请求的页面的相关配置数据无效 解决办法

    "HTTP 错误 500.19 请求的页面的相关配置数据无效" 解决办法   HTTP 错误 500.19 - Internal Server Error无法访问请求的页面,因为该 ...

  2. "HTTP 错误 500.19 请求的页面的相关配置数据无效" 解决办法

    HTTP 错误 500.19 - Internal Server Error无法访问请求的页面,因为该页的相关配置数据无效. 问题"详细错误信息模块 IIS Web Core通知 Begin ...

  3. win server2012r2上发布网站常见错误 "HTTP 错误 500.19 请求的页面的相关配置数据无效" 解决办法

    HTTP 错误 500.19 - Internal Server Error无法访问请求的页面,因为该页的相关配置数据无效. 问题“详细错误信息模块 IIS Web Core通知 BeginReque ...

  4. win7下IIS错误:"无法访问请求的页面,因为该页的相关配置数据无效"的解决方法(转)

    今天新装win7,然后在IIS下布署了一个网站,布署完成后运行,提示如下错误:HTTP 错误 500.19 - Internal Server Error无法访问请求的页面,因为该页的相关配置数据无效 ...

  5. HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效。

    HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效. 详细错误信息模块 IIS Web Core 通知 BeginReques ...

  6. IIS7 无法访问请求的页面,因为该页的相关配置数据无效

    HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效. 解决方案: C:\Windows\Microsoft.NET\Frame ...

  7. 遭遇“HTTP 错误 500.19 无法访问请求的页面,因为该页的相关配置数据无效。”

    windows 2008下IIS7 安装ASP.NET 遇到如下错误: HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效. ...

  8. Error-MVC:HTTP Error 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效。

    ylbtech-Error-MVC:HTTP Error 500.19 - Internal Server Error  无法访问请求的页面,因为该页的相关配置数据无效. 1.返回顶部 1. IIS ...

  9. IIS7.5 HTTP 错误500.19-Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效

    IIS7.5 HTTP 错误500.19-Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效 --------------------------------- ...

随机推荐

  1. Grafana和influxdb监控nginx日志中的请求响应时间图形化监控

    监控效果如图: 监控方法: 通过logstash过滤nginx日志,然后解析出nginx日志中的request time字段 然后output到influxdb时序数据库中 通过grafana展示数据 ...

  2. day14.生成器迭代器作业

    1.写生成器,从文件中读取内容,再每一行读取的内容前加上 ‘***’之后返回给用户 def func(filename): word = input('输入你想找的内容:') with open(fi ...

  3. spark DataFrame的创建几种方式和存储

    一. 从Spark2.0以上版本开始,Spark使用全新的SparkSession接口替代Spark1.6中的SQLContext及HiveContext接口来实现其对数据加载.转换.处理等功能.Sp ...

  4. thinkphp的静态缓存,数据缓存,快速缓存,查询缓存

    // 静态缓存 // 'HTML_PATH' 缓存目录,这是个常量不是配置项,在入口文件中定义 // 'HTML_CACHE_ON'     =>    true, // 开启静态缓存 'HTM ...

  5. Sorting It All Out (拓扑排序+floyd)

    An ascending sorted sequence of distinct values is one in which some form of a less-than operator is ...

  6. zoj3781

    zoj3781赛场上堵在了缩点上emmmmm把原始图相同颜色的方块缩成一个点,然后与它周围不同颜色的联通块连双向边,然后枚举每个点然后求最大深度的最小值因为每次翻转都相当于深度+1(可以手动模拟一下 ...

  7. Nginx模块 ngx_http_limit_req_module 限制请求速率

    The ngx_http_limit_req_module module (0.7.21) is used to limit the request processing rate per a def ...

  8. BZOJ-10-1176: [Balkan2007]Mokia-CDQ第二类应用

    思路 :按照操作的时间进行分治,这样转化成了 时间t ,x坐标,y坐标 经典的三维偏序. 最初时间就是递增顺序,无需排序直接进行第二维的分治,类似归并排序处理x坐标,在保证 x有序的情况下进行更新y坐 ...

  9. 一些有用的huginn Agent

    具体API地址 https://huginnio.herokuapp.com/agents 貌似这些Agent都可以按照频率和定时的时间点来触发, 1.Attribute Difference Age ...

  10. XVIII Open Cup named after E.V. Pankratiev. Ukrainian Grand Prix

    A. Accommodation Plan 对于已知的$K$个点,离它们距离都不超过$L$的点在树上是一个连通块,考虑在每种方案对应的离$1$最近的点统计. 即对于每个点$x$,统计离它距离不超过$L ...