手机数据如何发送到服务器?网络传输原理通俗全解

话说回来,
我们每天都要玩手机,
玩手机就会调用服务器。
那么,数据咋发送到服务器的?
今天,我们仔细讲一下这个原理,从头开始。
部分1:MAC,IP和端口
这三个在网络请求中都是比较重要的。
首先是MAC,
代表的是设备的物理地址,每个设备都不一样。
你可以当作设备的名称。
然后是端口,
用来区分软件,协议和服务的。
然后是IP,
代表的是设备在网络中的地址。
然后说到IP,
这时候不得不说一下IPv4和IPv6了。
大家应该很熟悉IPv4,而且经常用。
例如192 .168 .a. 1,
就是有4组数字组成,每个数字之间用小数点隔开。
其中,还有一个东西叫做子网掩码,
常见的长255. 255 .255 .0,
仔细用过手机的估计都能发现。
干啥的呢?
区分目标服务器的IP地址
是在广域网WAN还是局域网LAN。
在IPv4里面,IP地址和子网掩码
一般都是由上面路由器的DHCP服务器
或者独立DHCP服务器分配的,
手机不会凭空生成。

(除非你设置为固定IP地址)
然后,这里也讲一下IPv6。
IPv6和IPv4有很大区别。
首先,IPv4只有4个字段,每个字段用小数点隔开。
就例如192 .168 .a. 1,
那么,IPv6就更复杂了,
4和6仅代标识,不是字段数量标识。
IPv6有8个字段,
其中每个字段为4位16进制,
每个字段用冒号隔开。
就例如0:0:0:0:0:ffff:c0a8:1。
这时候,你发现,
前面有很多个0:0:0什么的,
嫌它多,直接改成::,完事。
所以IPv6就变成了::ffff:c0a8:1。
但是,这种操作只能用1次,否则会产生歧义。
例如你看到::1145::14::114,你觉得怪不怪?
位数都感觉不对劲,凑不出来。
当然,IPv6它也有所谓的子网掩码,
只不过叫做前缀,结构大概是/64。
那么IPv6咋分配?
很简单,有DHCP,也有SLAAC。
很简单,因为IPv6真的多,用都用不完,
所以,运营商会分配给
每家每户的路由器不同的网络前缀,
然后,路由器获得到了网络前缀,
后面由MAC地址生成或者随机生成。
分配给手机后,手机会直接沿用路由器的网络前缀,

网络后缀也由随机生成或者MAC地址生成。
但是,如果你仔细看手机IP地址,发现有3个地址,
两个前缀一样,
还有一个是fe80开头的。
其中一个叫全球单播地址,
能在任意不同种类的网直接定位到你的设备。
还有一个也是,只不过是临时的,
随机生成,定时改变。
还有一个是本地链路地址,
是fe80开头的,仅能在局域网转发时访问。
如果手机还有一个::ffff开头的,
属于内嵌IPv4地址,
就如刚刚的::ffff:c0a8:1,
相当于::ffff:192 .168 .0. 1,被硬格式整理了,成为了::ffff:c0a8:1。
部分2:数据到底是如何发送的
假如,
你要给服务器传数据,
无论是什么协议,
都需要标记上目的地,
就像你导航,
不输入目的地,它咋知道你要去哪。
这个是IP头部。
在IP头部,有协议类型(如TCP什么的),
有转发限制次数(TTL),目标和发送方IP地址,其它都不重要。
然后,网卡传输出去时,
还不行,还需要标记发给哪个设备节点,
它是MAC头部。
就像导航,
你要去某个大城市,
中途要到某个服务区休息一下。

还有,
发送过程中,数据包是有大小的(MTU),
常见的是IP头部+协议头部+数据小于等于1500,
超过1500需要重新发送,
因为一口吃不成胖子,但可以一口一口吃。

所以,传数据时,数据会拆成多个包,慢慢发送。
俗称拆包。
这也导致了,
你在这边下文件,
我,故,意,给,你,限,速;慢,慢,发。
而且,可以同时发送不同人的。
就是我的你的我的你的我的,
然后服务器是每秒千兆地发送,
路由器把我的数据分开再发到我手机就慢了,
每秒只有500兆。
好好好,不扯别的。
假如,我要给服务器发文件,
手机发送一个数据包给服务器,
然后通过对比子网掩码和服务器IP是在广域网,
于是把目标MAC设置成路由器。
首先数据到路由器,NAT映射一下,
NAT映射解决的是IPv4太少的问题。
(IPv6略过NAT映射,因为IPv6太多,设备的IP地址全球唯一不会重复)
就是内部端口转为外部端口,
局域网IP转为广域网IP。
路由器很喜欢干一件事情。
我们看见IP头部,有一个叫做转发限制次数的东西,
每转发一次,
它就会扣一次。
默认值一般是64。
这时候,因为数据要经过路由器处理转发,
则每次转发MAC头部就更换了,
目标MAC变成了下一台转发路由器的MAC地址。
接下来,
通过运营商设备,汇聚路由器,核心路由器,
骨干路由器转发后,
就能到达服务器。
这些设备转发依靠的是路由表,
就类似导游图,
告诉数据怎么走,
转发次数一般不超过30。
但是,
有些路由器会出现这种问题,
不更新路由表,甚至不会转发,
(常见于公司接太多路由器了,线也很乱,导致乱接了)
例如把三台家用路由器的WAN连接上下一台的LAN,
结果,
A发给B,B发给C,C发给A。
然后超过64次后,
转发次数归零了,
就会返回设备ICMP信息,
告诉发送方的设备,目标不可达。
但是,
说不定路由器连ICMP也转发不来。
转发64次后,就会直接扔掉。
回到刚刚说的,
假如转发到服务器了,
服务器就会接收到。
但是,
时间段不同,
刚刚不是说拆了很多个发吗?
服务器就会把不同时间段发过来的数据包粘在一起,
俗称粘包。
具体根据协议情况粘在一起。
部分3:常用的TCP
首先,假如用软件访问数据,
首先是基于TCP来传。
这时候,
用TCP传的时候,
要找正确的端口,区分软件和应用,
这个是TCP头部。

数据给网卡时,
套上IP头部,MAC头部,发送出去。
相当于数据套了3个头部,
经过路由器转发,发到了服务器,
服务器会进行粘包处理,
获得到用户传来的数据,
然后再处理数据,
处理好后,
会用相同的方式返回手机。
但是,
刚刚的过程是不是有点怪,
如果手机直接找服务器,发数据,
看起来有点不太礼貌。
就像送外卖,外卖员不打电话,敲门,
我咋知道外卖送到家门口了?
所以,客户端先问服务器能不能建立连接,
服务器说可以,
客户端回复收到,
然后再把数据发过来,
服务器收到处理后发回去。

这时候,
一直连着不断开,
和你拿完外卖后门不关有啥区别?
多难受。
所以,流程总共分四步。
任意一方回复关闭连接,
对方回复:等一下,
这段时间对方仍然可发送信息,叫做半关闭。
过了一会儿,对方回复:好的,关闭吧。
提出关闭方就会回复好的。
部分3:奇怪的UDP
真奇怪。
和TCP肯定是有区别的。
首先,TCP头部长,
UDP头部短。
而且,
UDP完全不用什么建立连接断开连接的。
相当于外卖放门口了,
外卖员直接跑了,门不敲也不打电话。
基本原理和TCP类似,
也要拆包,套上MAC头,IP头,UDP头,
只不过发送过去,啥都不管。
接收方也不用粘包(具体看情况)。
甚至没有发送成功都不一定知道。
漏包了也不管。
如果端口没有开的话,
发送方也可能不会知道。
部分4:常用的HTTP
话说回来,
我们访问某网站,
输入网址+页面,
它就识别出是怎么访问了。

那么,它的原理到底是啥?
说回来,
以前访问网站的时候是用IP地址。
但是,
你IP地址记得下来吗?
这么多个网站,而且还容易改变。
这时候,有人提出了用域名代替IP。
其中域名结构大概如a . 例子 . 后缀。
这时候,
手机访问该服务器,
但是不知道服务器的IP地址,
则就会去问。
问的服务器就是本地DNS服务器,
就是域名转IP的,也叫域名服务器。
本地DNS服务器就会给出是哪个IP。
如果本地DNS服务器不知道的话,
就会问其它DNS服务器。

顺序如下:
首先问根DNS服务器,这个网址的IP是什么,
但是,根DNS服务器记忆力也不太好,
只会回答我只知道 . 后缀的DNS服务器的IP。
然后本地DNS就会问 . 后缀的DNS服务器,
这个网址的IP是什么。
一样, . 后缀的DNS服务器就会回答,
我只知道 . 例子 . 后缀的DNS服务器的IP地址,
然后本地DNS服务器就会去问 . 例子 . 后缀的DNS服务器,
这个网址的DNS服务器就会回答IP是多少。
然后本地DNS服务器就会告诉该域名对应的服务器的IP是多少。
然后,HTTP协议使用的是TCP,
则你输入网址后,
手机就会向服务器发送请求。
当然,目标IP设置为刚刚问到的IP地址。
服务器接收到数据后,处理后发还给手机。
就这么简单。
但是,你以为这么简单,
你是不是觉得一件事,
如果你访问不同的域名,
都是同一个服务器,
例如a . 例子 . 后缀和b . 例子 . 后缀
DNS给出的IP相同,
相当于目标服务器相同,
但是访问时,页面不同?
原理是这样,
刚刚说过TCP被套了3个头,
到HTTP又套了一个,俗称HTTP头。
注意,请求HTTP头和响应HTTP头都不一样。
例如你访问http : //a . 例子 . 后缀 /a时,
这个我们一般俗称网址(专业名称URL)。
实际上,就是向a . 例子 . 后缀对应的IP
对应的服务器的80端口发起TCP请求。
然后,请求HTTP头包含路径,方法和请求标头,
其中路径仅记录/a就行,
方法就是用什么方式请求,
常见的是GET,POST,PUT,PATCH,DELETE等。
简单记为:查,增,全改,部分改,删。
一般访问网页大多用GET方式,
在GET方式下,请求HTTP头后面就不会携带请求所需数据了。
如果使用POST,PUT,PATCH等其它方式,
请求HTTP头后面就能携带一些所需数据,
例如PATCH方法的请求后面携带数据代表的是修改特定数据,
如仅修改用户昵称为XXX。
然后请求标头就是记录请求的一些必要数据,
例如你是用a . 例子 . 后缀网址访问的(Host部分),
而不是b . 例子 . 后缀。
否则就会返回b . 例子 . 后缀的页面了。
但是,你仔细看URL。
好像结构没这么简单,
后面会跟上很多内容,例如这样:
http : // a . 例子 . 后缀 : 8 0 /a ? c=d & m=n # e
前面的http代表的是协议,
a . 例子 . 后缀是主机,
:80是端口,/a是路径,
?后面的c=d&m=n是查询参数。
查询数据为c=d和m=n。
# e 是锚点,告诉页面在哪一行的。
# e 仅在浏览器展示页面有用,
实际上不会发送进HTTP请求。
回到正题,
服务器处理后,就会返回数据。
接下来是服务器回复的HTTP部分,
包含响应HTTP头和响应数据。
响应HTTP头包含状态码,响应标头,
状态码2开头正常,3为重定向,4为客户端错误,5为服务器错误。
所以,大家应该都知道,
服务器返回404not found找不到,指的是状态码404。
响应标头和请求标头类似,
代表返回时必要的信息。
然后后面的响应数据就是页面的代码,
例如网页的源代码,常用的是HTML语言,
例如你保存下来某些感兴趣的页面后,用记事本打开后,看见很多
< 对象名称 属性名称 = " 属性值 " >文字或对象< / 对象名称 >
的结构。
这个就是HTML超文本的结构。
HTTP就是这样传输过来的。
本文内容仅供参考,不构成任何专业建议。使用本文提供的信息时,请自行判断并承担相应风险。



