TCP协议与Web服务基础

    TCP协议工作在OSI模型的传输层,提供一个可靠的面向连接的服务,其可靠性在于,通信的双方要建立一个端到端的虚电路,通过三次握手建立通信,断开通信需要四次握手。其连接模型如下:

技术分享

1、建立连接协议(三次握手)

(1)客户端发送一个带SYN标志的TCP报文到服务器。(报文1)

(2) 服务器端回应客户端的一个同时带ACK标志和SYN标志的TCP报文。(报文2)。表示对刚才客户端SYN报文的回应;同时又标志SYN给客户端,询问客户端是否准备好进行数据通讯。

(3) 客户再次回应服务器端一个带ACK标志的TCP报文。(报文3)

 2、连接终止协议(四次握手)

   由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

 (1) TCP客户端发送一个FIN,用来关闭客户端到服务器端的数据传送(报文4)。

 (2) 服务器收到这个FIN,它发回一个ACK。(报文5)。

 (3) 服务器关闭客户端的连接,发送一个FIN给客户端(报文6)。

 (4) 客户端发回ACK报文确认(报文7)。

 

技术分享

    CLOSED:表示初始状态。

    LISTEN:表示服务器端的某个SOCKET套接字套接字处于监听状态,可以接受连接了。

    SYN_SENT: 这个状态表示客户端已发送SYN报文。当客户端SOCKET套接字执行CONNECT连接时,它首先发送SYN报文,因此也随即它会进入到了SYN_SENT状态,并等待服务端的发送三次握手中的第2个报文。

    SYN_RCVD: 这个状态表示接受到了SYN报文,在正常情况下,这个状态是服务器端的SOCKET套接字在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂,基本上用netstat是很难看到这种状态的。因此这种状态时,当收到客户端的ACK报文后,它会进入到ESTABLISHED状态。

    ESTABLISHED:表示连接已经建立了。

    FIN_WAIT_1: 这个状态实际上是当SOCKET套接字在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET套接字即进入到FIN_WAIT_1状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2状态,当然在实际的正常情况下,无论对方何种情况下,都应该马上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态还时常可以用netstat看到。

    FIN_WAIT_2:实际上FIN_WAIT_2状态下的SOCKET套接字,表示半连接,即有一方要求关闭连接,但另外还告诉对方,我暂时还有点数据需要传送给你,稍后再关闭连接。

    TIME_WAIT: 表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。如果FIN_WAIT_1状态下,收到了对方同时带 FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。

    CLOSE_WAIT: 这种状态的含义其实是表示在等待关闭。怎么理解呢?当对方关闭一个SOCKET套接字后发送FIN报文给自己,系统毫无疑问地会回应一个ACK报文给对方,此时则进入到CLOSE_WAIT状态。接下来呢,实际上你真正需要考虑的事情是察看你是否还有数据发送给对方,如果没有的话,那么你也就可以 关闭这个SOCKET套接字,发送FIN报文给对方,也即关闭连接。所以你在CLOSE_WAIT状态下,需要完成的事情是等待你去关闭连接。

    LAST_ACK:它是被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,也即可以进入到CLOSED可用状态了。

    web服务是一个C/S结构,使用基于TCP的http协议完成客户端与服务器端的数据交互。在客户端使用用户代理(如浏览器等)与服务器建立连接,而服务器端则监听tcp的80端口,等待客户端的连接请求。

    一次web事务即客户端发出请求,服务器端发出相应的交互过程如下:

    建立连接:接收客户端的连接请求,(3次TCP握手,根据客户端的http请求报文,标识客户端IP地址)。

    接收请求:接收从来自客户端的http请求报文,读取特定的资源请求

    处理请求:对http请求报文进行解析,根据http请求报文的首部,获取客户端请求的资源等信息。

    访问资源:根据请求的资源,访问资源的存放目录

    构建响应报文:将请求的资源信息构建成响应报文

    发送响应报文:将响应报文发还给客户端

    记录访问日志:将客户端的连接请求以及资源请求信息记录到http日志中

    实现http协议的web服务是一个无状态的协议,提供了持久连接和非持久连接两种方式完成用户响应。http有http request和http response两种报文格式。这两种报文都是由三部分组成:

技术分享

http request报文格式:

技术分享

    method:方法,表示客户端希望对服务器资源执行的动作;

    http的常用方法<method>

技术分享

    Request-URL:请求URL,所请求的特定资源路径,可以是相对URL,也是绝对URL

    version: HTTP协议版本,HTTP/1.1,HTTP/1.0。

    header

        通用首部:请求报文和响应报文均可使用;

Date: 报文的创建时间;

Connection: 指定请求/响应有关的选项

Via: 显示报文经过的中间节点;

Cache-Control: 缓存控制

        常见的请求首部

            a.信息性首部:

Client-IP:客户端IP

Host: 请求的服务器的主机名和端口号

Referer:包含了当前请求资源的URL的上一级资源URL;

User-Agent:客户端代理

    b.Accept首部:

Accept: 通知服务器能够发送的媒体的类型,MIME

Accept-Charset:通知服务器能够发送的字符集

Accept-Encoding: 通知服务器能够发送编码方式,如gzip

Accept-Language: 通知服务器能够发送的语言

            c.条件式请求首部:

 Expect:期望服务器发送的媒体的类型

If-Modified-Since:自从指定的时间之后是否发生了改变;

 If-None-Match: 本地缓存的文档的ETag与服务器端的文档的Etag是否不匹配;

    d.安全请求首部:

Authorization: 向服务器发送认证信息;

Cookie:客服端向服务器发送的身份标识;

    e.代理请求首部:

Proxy-Authorization:与Authorization相似,但此是用于与代理进行认证时使用

http response报文格式:

 

技术分享

    version: HTTP协议版本

    status:状态码,三位的数字,第一位数字用于描述状态类别;

http的响应状态码:

100-199:100-101              提示信息,其余尚未定义

200-299:200-206              成功,其余尚未定义

300-399:300-305              重定向,其余尚未定义

400-499:400-415              客户端错误,其余尚未定义

500-599:500-505              服务端错误,,其余尚未定义

200:成功,请求的所有数据通过响应报文的body部分发送,原因短语为OK

301:请求的URL已经移除,但在响应报文首部通过Location指明了资源现在所处的位置;原因短语为Moved Permanently

302: 与301相似,但在响应报文首部通过Location资源的临时位置;原因短语为Found

304:客户发出条件式请求,如果服务器发现资源未改变,则可通过响应报文告诉客户端;原因短语为Not Modified

401:需要输入账号和密码,原因短语为Unauhtorized

403:请求被禁止;原因短语为Forbidden

404:服务器无法找到所请求的URL对应的资源,原因短语为Not Found

500:服务器内部错误,原因短语为Internal Server Error

502:代理服务器从后端服务收到了一条伪响应;原因短语为Bad Gateway

    reason-phrase:原因短语,状态的码可读版本;

    headers

        通用首部:请求报文和响应报文均可使用;

Date: 报文的创建时间;

Connection: 指定请求/响应有关的选项

Via: 显示报文经过的中间节点;

Cache-Control: 缓存控制

        常见的响应首部:

a.信息性首部:

Age:响应的持续时间

Server:通知客户端服务器的版本

b.协商首部:

Vary:服务器与客户端协商适合客户端查看的响应格式

c.安全响应首部:

WWW-Authentication:向客户端发送认证质询信息;

Set-Cookie:设定cookies,向客户端发送身份令牌;

Proxy-Authentication:代理向客户端发送认证质询信息

例如:访问www.lcu.edu.com主机的http request和http response报文

技术分享

 


本文出自 “花果山二当家” 博客,请务必保留此出处http://948555452.blog.51cto.com/9146446/1591962

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。