首页 > 代码库 > TCP协议与Web服务基础
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
TCP协议与Web服务基础