TCP/IP如何保证数据数据包的传输有序可靠

对字节流分段并进行编号然后通过 ACK 回复超时重发这两个机制来保证。

(1)为了保证数据包的可靠传递,发送方必须把已发送的数据包保留在缓冲区;
(2)并为每个已发送的数据包启动一个超时定时器;
(3)如在定时器超时之前收到了对方发来的应答信息(可能是对本包的应答,也可以是对本包后续包的应答),则释放该数据包占用的缓冲区;
(4)否则,重传该数据包,直到收到应答或重传次数超过规定的最大次数为止。
(5)接收方收到数据包后,先进行CRC校验,如果正确则把数据交给上层协议,然后给发送方发送一个累计应答包,表明该数据已收到,如果接收方正好也有数据要发给发送方,应答包也可方在数据包中捎带过去。

CORS具体用法

CORS(cross-origin resource sharing)

分两种情况,简单请求和非简单请求

简单请求:

(1) 请求方法是以下三种方法之一:

HEAD
GET
POST
(2)HTTP的头信息不超出以下几种字段:

Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain

在发送简单的跨域请求时,浏览器判断这次发送的请求是跨域的简单请求,就会自动在头信息中监听一个origin字段

GET /cors HTTP/1.1
Origin: http://api.bob.com
Host: api.alice.com
Accept-Language: en-US
Connection: keep-alive
User-Agent: Mozilla/5.0...

服务器在接收到这个请求之后,如果发现origin不在许可范围之内,就会返回一个正常的http回应,而浏览器收到这个回应之后,发现没有access-control-allow-origin字段,就知道出现了错误,就会抛出一个错误,被xmlhttprequest的onerror回调函数捕获。

如果这个origin是服务器的许可范围之内,他就会在响应中的响应头增加几个字段

//请求时的源或者是*,代表接受任意域名的请求
Access-Control-Allow-Origin: http://api.bob.com
//是否发送cookie,默认跨源请求是不包含cookie的,设为true可以发送cookie
Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers: FooBar
Content-Type: text/html; charset=utf-8

浏览器收到响应之后就可以正常使用

非简单请求

在请求方法为PUT或DELETE等情况时,该请求是非简单请求,就需要进行一次预检

首先浏览器会发送一个options请求其中包括源信息,要使用的方法,cors会额外发送的头信息

OPTIONS /cors HTTP/1.1
Origin: http://api.bob.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: X-Custom-Header
Host: api.alice.com
Accept-Language: en-US
Connection: keep-alive
User-Agent: Mozilla/5.0...

服务器收到这个请求之后,检查了origin,method和header字段之后,如果允许跨域请求,就会做出回应

HTTP/1.1 200 OK
Date: Mon, 01 Dec 2008 01:15:39 GMT
Server: Apache/2.0.61 (Unix)
Access-Control-Allow-Origin: http://api.bob.com
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: X-Custom-Header
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Content-Length: 0
Keep-Alive: timeout=2, max=100
Connection: Keep-Alive
Content-Type: text/plain

包括了源地址,可以使用的所有方法,可以包含的头信息等

如果服务器否定了预检,那就会返回一个普通的http请求,那么浏览器收到后就会进行报错

在预检结束之后,就可以开始正式的http请求发送,类似于简单请求的发送