1、这么多设备向服务器发请求,服务器怎么知道某个响应结果应该回传
首先,一般的HTTP协议的请求,都是在TCP的3次握手之后再进行数据传输的。在这3次握手之后就已经“建立起了连接”。可以说在3次握手的时候就已经确定了源和目标的ip+端口(如果是IPv4 Internet Protocol version 4的话)。
那具体是怎么知道的呢?
1.源和目标之间发送的是数据包,是一段数据流。
2.这个IP包有自己的数据结构,如下:
*转载自http://blog.csdn.net/ns_code/article/details/29382883 *
3.而其中IP头部的数据结构如下:
转载自http://www.51testing.com/html/66/138366-216709.html
4.TCP头部的数据结构如下:
5.可以看到,IP头部结构中的Source Address和Destination Address,长度为32bit(最多可表示256的4次方),即源和目标的IP地址。
6.TCP头部结构中的源端口号和目的端口号,就标识了客户端和服务器中具体的某一个进程。
有了这些数据就能唯一确定源和目标,这样服务器的结果就能只响应给我,而不是响应给你。
另外,我们常说的“3次握手之后就建立起了连接,就能传数据了”,这个“建立起了连接”是啥意思?
“建立起了连接”是个笼统的说法,更准确的版本是“建立起了传输数据的环境”或者说“接收方和发送方,都知道自己要向什么地方发送数据,而且能够保证自己所得到的数据,就是发送方发的数据”。
这个环境至少需要两个条件:
- 源和目标的IP+端口号
- 源和目标双方都确认了起始序列号
第一点其实就是上面说的,第二点是这样:
首先
TCP 会通过三次握手来完成连接建立,具体过程是这样的:
1.客户端首先向服务端发送一个 SYN 包和一个随机序列号 A
2.服务端收到后会回复客户端一个 SYN-ACK 包以及一个确认号(用于确认收到 SYN)A+1,同时再发送一个随机序列号 B
3.客户端收到后会发送一个 ACK 包以及确认号(用于确认收到 SYN-ACK)B+1 和序列号 A+1 给服务端
转载自https://objccn.io/issue-10-6/
有了这些序列号,源和目标才能够保证数据的有效性,也就是我们说的“建立起了连接”
。