Network
HTTP
- HTTP构建于TCP/IP协议之上,默认端口号是80
- HTTP是无连接无状态的
概念
HTTP 协议是以 ASCII 码传输,建立在 TCP/IP 协议之上的应用层规范。
HTTP请求与响应
HTTP 请求由三部分组成:
- 请求行
- 请求头
- 请求正文
// 请求行
POST /index.php HTTP/1.1
// 请求头
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://localhost/
Content-Length:25
Content-Type:application/x-www-form-urlencoded
// 请求正文
username=aa&password=1234
HTTP响应也由3个部分构成,分别是:
- 状态行
- 响应头(Response Header)
- 响应正文
// 响应行
HTTP/1.1 200 OK
// 响应头
Server:Apache Tomcat/5.0.12
Date:Mon,6Oct2003 13:23:42 GMT
Content-Length:112
// 响应正文
<html>...
响应状态码
响应码可根据第一位数字分五类表示:
- 1xx:信息,请求收到,继续处理
- 2xx:成功,行为被成功地接受、理解和采纳
- 3xx:重定向,为了完成请求,必须进一步执行的动作
- 4xx:客户端错误,请求包含语法错误或者请求无法实现
- 5xx:服务器错误,服务器不能实现一种明显无效的请求
几个常用状态码示意:
| Code | Descriptions |
|---|---|
| 200 | OK 客户端请求成功 |
| 301 | Moved Permanently 请求永久重定向 |
| 302 | Moved Temporarily 请求临时重定向 |
| 304 | Not Modified 文件未修改,可以直接使用缓存的文件。 |
| 400 | Bad Request 由于客户端请求有语法错误,不能被服务器所理解。 |
| 401 | Unauthorized 请求未经授权。这个状态代码必须和WWW-Authenticate报头域一起使用 |
| 403 | Forbidden 服务器收到请求,但是拒绝提供服务。服务器通常会在响应正文中给出不提供服务的原因 |
| 404 | Not Found 请求的资源不存在,例如,输入了错误的URL |
| 500 | Internal Server Error 服务器发生不可预期的错误,导致无法完成客户端的请求。 |
| 503 | Service Unavailable 服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常。 |
交互方式
HTTP定义了GET,POST,PUT,DELETE四种最基本的与服务器交互方式,URL全称为统一资源定位符,用于描述网络上的一个资源,可以认为而 HTTP 中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。
GET与POST请求的区别:
GET请求将请求数据放在URL里,和POST则将请求数据放在请求主体中;- 虽然HTTP没有对请求数据大小做限制,但
GET请求实际会受到浏览器URL输入长度限制,而POST请求理论上不受限制; POST请求相对于GET请求相对安全
其他交互方式:
| Method | Descriptions |
|---|---|
| HEAD | 与 GET 相同,但只返回 HTTP 报头,不返回文档主体。 |
| OPTIONS | 返回服务器支持的 HTTP 方法。 |
| CONNECT | 把请求连接转换到透明的 TCP/IP 通道。 |
TCP
- TCP提供一种面向连接的、可靠的字节流服务 在一个TCP连接中,仅有两方进行彼此通信。广播和多播不能用于TCP
- TCP使用校验和,确认和重传机制来保证可靠传输
- TCP使用累积确认
- TCP使用滑动窗口机制来实现流量控制,通过动态改变窗口的大小进行拥塞控制
三次握手
- 第一次握手:建立连接。客户端发送连接请求报文段,将
SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认; - 第二次握手:服务器收到
SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,自己自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态; - 第三次握手:客户端收到服务器的
SYN+ACK报文段。然后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。

四次分手
- 第一次分手:主机1(可以使客户端,也可以是服务器端),设置
Sequence Number和Acknowledgment Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了; - 第二次分手:主机2收到了主机1发送的FIN报文段,向主机1回一个
ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我“同意”你的关闭请求; - 第三次分手:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入
LAST_ACK状态; - 第四次分手:主机1收到主机2发送的FIN报文段,向主机2发送
ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。
网络结构
OSI结构

TCP/IP结构
