一、TCP

TCP Socket通信详细过程

TCP socket通信过程图

二、HTTP

Http协议详解(深入理解)

1、http协议的作用及特点

  • HTTP是一个客户端和服务器端请求和应答的标准(TCP)。客户端是终端用户,服务器端是网站。通过使用Web浏览器、网络爬虫或者其它的工具,客户端发起一个到服务器上指定端口(默认端口为80)的HTTP请求。(我们称这个客户端)叫用户代理(user agent)。应答的服务器上存储着(一些)资源,比如HTML文件和图像。

  • 通常,由HTTP客户端发起一个请求,建立一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端发送过来的请求。一旦收到请求,服务器(向客户端)发回一个状态行,比如"HTTP/1.1 200 OK",和(响应的)消息,消息的消息体可能是请求的文件、错误消息、或者其它一些信息。HTTP使用TCP而不是UDP的原因在于(打开)一个网页必须传送很多数据,而TCP协议提供传输控制,按顺序组织数据,和错误纠正。

  • 特点:

    • 1.基于请求/响应模型的协议。请求和响应必须成对,先有请求后有响应
    • 2.http协议默认端口:80
    • 3.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
    • 4.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
    • 5.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
    • 6.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

2、版本区别

  • http协议的版本
    HTTP/1.0,发送请求,创建一次连接,获得一个web资源,连接断开
    HTTP/1.1,发送请求,创建一次连接,获得多个web资源,连接断开

3、协议组成

  • Http协议由Http请求和Http响应组成,当在浏览器中输入网址访问某个网站时, 你的浏览器会将你的请求封装成一个Http请求发送给服务器站点,服务器接收到请 求后会组织响应数据封装成一个Http响应返回给浏览器。即没有请求就没有响应。

  • http请求包括:请求行、请求头、请求体

  • http响应包括:响应行、响应头、响应体

3.1、HTTP请求报文

HTTP请求报文由3部分组成(请求行+请求头+请求体):
图片说明
####3.1.1、请求行:

  • 例如:POST /chapter17/user.html HTTP/1.1
    格式:请求方式 资源路径 协议/版本
    请求行必须在http请求格式的第一行。

  • get请求:
    将请求参数追加在url后面,不安全
    url长度限制get请求方式数据的大小
    没有请求体
    一般的HTTP请求大多都是GET。

  • post请求:
    请求参数在请求体处,较安全。
    请求数据大小没有显示
    只有表单设置为method=“post”才是post请求,其他都是get请求

3.1.2、请求头:

  • 例如:Host: 39.108.107.149:8080
    请求头从第二行开始,到第一个空格结束。请求头和请求体之间存在一个空格(如下)
POST http://39.108.107.149:8080/vk/app/rest/ddp/iModelServiceImpl/findModelByType HTTP/1.1
User-Agent: Fiddler
Host: 39.108.107.149:8080
Content-Length: 11

name=城市
  • 请求头通常以键值对{key:value}方式传递数据。
    key为规范的固定值
    value为key对应的取值,通常是一个值,可能是一组。

3.1.3、请求体

  • 当请求方式是post的时,请求体会有请求的参数,格式如下:
    username=zhangsan&password=123

3.2、http响应报文

  • HTTP的响应报文也由三部分组成(响应行+响应头+响应体)
    图片说明

3.2.1、响应行

  • 报文协议 + 状态码及状态描述

  • 状态码:由3位数字组成,第一个数字定义了响应的类别:

  • 1xx:指示信息,表示请求已接收,继续处理

  • 2xx:成功,表示请求已被成功接受,处理。
    200 OK:客户端请求成功
    204 No Content:无内容。服务器成功处理,但未返回内容。一般用在只是客户端向服务器发送信息,而服务器不用向客户端返回什么信息的情况。不会刷新页面。
    206 Partial Content:服务器已经完成了部分GET请求(客户端进行了范围请求)。响应报文中包含Content-Range指定范围的实体内容

  • 3xx:重定向
    301 Moved Permanently:永久重定向,表示请求的资源已经永久的搬到了其他位置。
    302 Found:临时重定向,表示请求的资源临时搬到了其他位置
    303 See Other:临时重定向,应使用GET定向获取请求资源。303功能与302一样,区别只是303明确客户端应该使用GET访问
    307 Temporary Redirect:临时重定向,和302有着相同含义。POST不会变成GET
    304 Not Modified:表示客户端发送附带条件的请求(GET方法请求报文中的IF…)时,条件不满足。返回304时,不包含任何响应主体。虽然304被划分在3XX,但和重定向一毛钱关系都没有

  • 4xx:客户端错误
    400 Bad Request:客户端请求有语法错误,服务器无法理解。
    401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。
    403 Forbidden:服务器收到请求,但是拒绝提供服务
    404 Not Found:请求资源不存在。比如,输入了错误的url
    415 Unsupported media type:不支持的媒体类型

  • 5xx:服务器端错误,服务器未能实现合法的请求。
    500 Internal Server Error:服务器发生不可预期的错误。
    503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常.

3.2.2、响应头:

  • 响应报文头,也是由多个属性组成;
    响应头也是用键值对k:v
    服务器通过响应头来控制浏览器的行为,不同的头浏览器操作不同

3.2.3、响应体:

  • 响应报文体,服务器发送给浏览器的正文,即我们真正要的“干货” ;
    响应体,响应体是服务器回写给客户端的页面正文,浏览器将正文加载到内存,然后解析渲染 显示页面内容

4、Http 协议中的扩展

  • 如果传输的文件过大怎么办

    服务器上返回的资源文件比较大,比如有些 js 文件大小可能就有几兆。文件过大就会影响传 输的效率,同时也会带来带宽的消耗。怎么办呢?
    1、常见的手段是,对文件进行压缩,减少文件大小。那压缩和解压缩的流程怎么实现呢? 首先服务端需要能支持文件的压缩功能,其次浏览器能够针对被压缩的文件进行解压缩。浏 览器可以指定 Accept-Encoding 来高速服务器我当前支持的编码类型 Accept-Encoding:gzip,deflate 那服务端会根据支持的编码类型,选择合适的类型进行压缩。常见的编码方式有:gzip/deflate
    2、分割传输 在传输大容量数据时,通过把数据分割成多块,能够让浏览器逐步显示页面。这种把实体主 体分块的功能称为分块传输编码(Chunked Transfer Coding)。

  • 每次请求都要建立连接吗?

    在最早的 http 协议中,每进行一次 http 通信,就需要做一次 tcp 的连接。而一次连接需要进 行 3 次握手,这种通信方式会增加通信量的开销。
    所以在 HTTP/1.1 中改用了持久连接,就是在一次连接建立之后,只要客户端或者服务端没有 明确提出断开连接,那么这个 tcp 连接会一直保持连接状态 持久连接的一个最大的好处是:大大减少了连接的建立以及关闭时延。 HTTP1.1 中有一个 Transport 段。会携带一个 Connection:Keep-Alive,表示希望将此条连接 作为持久连接。

图片说明

5、http的无状态连接实现

  • Http 无状态协议
    HTTP 协议是无状态的,什么是无状态呢?就是说 HTTP 协议本身不会对请求和响应之间的 通信状态做保存。 但是现在的应用都是有状态的,如果是无状态,那这些应用基本没人用,你想想,访问一个 电商网站,先登录,然后去选购商品,当点击一个商品加入购物车以后又提示你登录。这种 用户体验根本不会有人去使用。那我们是如何实现带状态的协议呢?

  • 客户端支持的 cookie
    Http 协议中引入了 cookie 技术,用来解决 http 协议无状态的问题。通过在请求和响应报文 中写入 Cookie 信息来控制客户端的状态;Cookie 会根据从服务器端发送的响应报文内的一 个叫做 Set-Cookie 的首部字段信息,通知客户端保存 Cookie。当下次客户端再往该服务器 发送请求时,客户端会自动在请求报文中加入 Cookie 值后发送出去。

  • 服务端支持的 session
    服务端是通过什么方式来保存状态的呢? 在基于 tomcat 这类的 jsp/servlet 容器中,会提供 session 这样的机制来保存服务端的对象状态,服务器使用一种类似于散列表的结构来保存信 息,当程序需要为某个客户端的请求创建一个 session 的时候,服务器首先检查这个客户端 的请求是否包含了一个 session 标识- session id; 如果已包含一个 session id 则说明以前已经为客户端创建过 session,服务器就按照 session id 把这个 session 检索出来使用(如果检索不到,会新建一个); 如果客户端请求不包含 sessionid,则为此客户端创建一个 session 并且生成一个与此 session 相关联的 session id, session id 的值是一个既不会重复,又不容易被找到规律的仿造字符 串,这个 session id 将会返回给客户端保存。

图片说明

6、Http协议中有哪些请求方式?

  • GET:用于请求访问已经被URI(统一资源标识符)识别的资源,可以通过URL传参给服务器
  • POST:用于传输信息给服务器,主要功能与GET方法类似,但一般推荐使用POST方式
  • PUT:传输文件,报文主体中包含文件内容,保存到对应URI位置
  • HEAD:获得报文首部,与GET方法类似,只是不返回报文主体,一般用于验证URI是否有效
  • DELETE:删除文件,与PUT方法相反,删除对应URI位置的文件
  • OPTIONS:查询响应URI支持的HTTP方法

7、get与post请求的区别?

  • 区别一:get重点在从服务器上获取资源,post重点在想服务器发送数据;

  • 区别二:get传输数据是通过URL请求,以filed(字段)=value的形式,置于URL后,并用"?"连接,多个请求数据之间用
    "&"连接,如http://127.0.0.1/Test/login.action?name=admin&password=admin,这个过程用户是可见的

  • 区别三:get传输量小,因为受URL长度限制,但效率较低
    post可以传输大量数据,所以上传文件时只能用post方式

  • 区别四:get是不安全的,因为URL是可见的,可能会泄露私密信息,如密码等
    post较get安全

8、常见的Http协议状态

200:请求被正常处理
204:请求被受理但没有资源可以返回
206:客户端只是请求资源的一部分,服务器只对请求的部分资源执行GET方法,相应报文中通过Content-Range指定范围的资源。
301:永久性重定向
302:临时重定向
303:与302状态码有相似功能,只是它希望客户端在请求一个URI的时候,能通过GET方法重定向到另一个URI上
304:发送附带条件的请求时,条件不满足时返回,与重定向无关
307:临时重定向,与302类似,只是强制要求使用POST方法
400:请求报文语法有误,服务器无法识别
401:请求需要认证
403:请求的对应资源禁止被访问
404:服务器无法找到对应资源
500:服务器内部错误
503:服务器正忙