Network

HTTP面试基础

TCP连接的三次握手与四次分手

计算机网络结构

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定义了GETPOSTPUTDELETE四种最基本的与服务器交互方式,URL全称为统一资源定位符,用于描述网络上的一个资源,可以认为而 HTTP 中的GETPOSTPUTDELETE就对应着对这个资源的查,改,增,删4个操作。

GETPOST请求的区别:

  • 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三次握手。

tcp_connect

四次分手

  • 第一次分手:主机1(可以使客户端,也可以是服务器端),设置Sequence NumberAcknowledgment Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;
  • 第二次分手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment NumberSequence 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结构

osi_struct

TCP/IP结构

tcp_struct

results matching ""

    No results matching ""