TCP 协议知识整理


TCP

TCP (Transmission Control Protocol) 是一种传输层通信协议。

在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。

不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。

TCP 传输过程

一个典型的传输过程,就是一个对数据的逐层封装:

  • 一、应用层向传输层发送用于网间传输的、用8位字节表示的数据流(Stream)。

    用户数据
  • 二、传输层的 TCP 把数据流分割成适当长度(受所处网络的数据链路层 MTU 限制)的报文段(segment)。

    TCP 头 用户数据
  • 三、TCP 把结果传给网络层。网络层的 IP 将报文段封装成数据报(Datagram)。

    IP 头 TCP 头 用户数据
  • 四、IP 层再将数据报交由数据链路层封装成帧(Frame)用于发送。

    帧头 IP 头 TCP 头 用户数据 帧尾
  • 五、通过物理层传输数据。

接受端对数据的操作是个反向操作,称为解封装,逐层移除头信息。

TCP 连接创建(三次握手 three-way handshake)

建立一个 TCP 连接,需要经过三次握手:

READ MORE...

常见跨域通讯技术总结

背景

基于安全性的考虑,浏览器会遵守一个叫做同源策略的安全策略,默认情况下,XmlHttpRequest 对象只能访问其所在页面同一个域 (域名、协议、端口均相同) 的资源。然而,许多应用程序开发过程中,对跨域资源的访问也是很常见的需求。因此,掌握各种合理的跨域资源访问技术是很重要的。

下面列举一些常见的跨域技术。

CORS ( Cross-Origin Resource Sharing )

W3C 推出的 CORS 规范,定义了访问跨源资源时,浏览器和服务器的沟通方式。

使用这种跨域资源访问技术,需要服务器、浏览器同时支持。现代浏览器的支持情况:

  • Firefox 3.5+
  • Safari 4+
  • IE 10+
  • iOS Safari
  • Android Browser
  • Chrome

IE 8 开始引入的 XDomainRequest 也实现了一部分的 CORS 规范。
XDomainRequest 的使用跟 XMLHttpRequest 略有不同,
如 open 方法只支持两个参数(因为所有xdr请求都异步)、不能发送cookie、只支持 get、post方法等等。

CORS 具体实现是,通过 HTTP 首部字段进行交互。大致过程:

READ MORE...

XSS 攻击与防范

跨站脚本攻击

跨站脚本攻击,Cross-site scripting, 缩写 XSS, ( 以前的文档也有写作 CSS 的,但跟层叠样式表的缩写一样,为了区分,现在一般称作 XSS ),是一种非常常见的网络攻击方式,类似于 SQL 注入,也是一种注入攻击。

XSS 通过在网页中插入危险脚本,可以绕过同源策略之类的安全机制,获得执行危险操作的权限,达到攻击的目的。这些攻击可能涵盖访问敏感信息、篡改 HTML 内容、跳转到恶意网站、监控用户输入等等等,具有相当大的威胁。

攻击的逻辑

  • 对于服务器来说,攻击代码是是一种普通数据(如一段 HTML 字符串),对服务器本身是没有特殊意义的,不会对服务器的行为有影响
  • 对于客户端来说,攻击代码(如 HTML )是一种有特定意义的指令,会影响客户端的行为
  • XSS 攻击通常会在客户端传递经过精心设计的恶意内容给服务器,这些数据会影响服务器正常组装 HTML、JavaScript、CSS 等指令代码的过程,让最终组装出来的指令代码包含恶意内容。

比如,通过传递经过巧妙设计的 URL 查询参数,让服务器使用该参数组装 HTML 标签时,意外提前闭合 HTML 标签,然后接续上一段攻击代码,这些包含攻击代码的 HTML 在浏览器上就反映为攻击。

XSS 的类型

XSS 根据特点,可以分为几种类型。

READ MORE...

Immutable.js

网络上找到的一张原理图:

  1. 对 Immutable 对象的任何修改或添加删除操作都会返回一个新的 Immutable 对象。
  2. 如果对象树中一个节点发生变化,只修改这个节点和受它影响的父节点,其它节点则进行共享。
  3. Immutable 实现的原理是 Persistent Data Structure(持久性数据结构)
  4. Immutable 使用了 Structural Sharing 来节省内存、提升效率(深拷贝效率低,内存占用大

全文完

READ MORE...

HTTP 请求报文

HTTP 报文结构

起始行

报文第一行内容即为起始行,请求报文和响应报文中有所区别

请求报文的起始行包含:

  1. HTTP 动作(GET, POST, PUT, DELETE, PATCH, …)
  2. 操作的资源
  3. HTTP 版本

例:

1
GET /example/example.jpg HTTP/1.1

响应报文的起始行包含:

  1. HTTP 版本
  2. HTTP 状态码
  3. HTTP 状态描述

例:

1
HTTP/1.1 200 OK

首部(headers)

首部内容紧接着起始行之后,每行代表一个首部字段。 一个 HTTP 报文可以拥有多个或者零个首部字段。

每个首部字段的结构是一个名值对,字段名后面跟着一个冒号,冒号之后是字段值。如:

1
Content-Type: text/html

最后,首部以一个空行结束(即使后面没有 body 部分也不可省略)。

READ MORE...