PM技术课 | 计算机网络知多少?
本文笔者将与大家分享:TCP/IP协议族、HTTP、TCP、UDP、Socket、状态码等的基础知识。
一个完整的通信过程
互联网,顾名思义,就是互相连接,形成网络。其中的关键是“联网”,从技术上看,联网就是通信。
那么,通信的过程是怎么样的呢?使用浏览器访问网页,是最为常见的通信方式,我们也以访问网页为例,查看一个完整的通信过程。
我们在浏览器中输入一个 URL,回车之后便会在浏览器中观察到页面内容,实际上这个过程经过了很多个步骤。
- 我们在地址栏输入一个URL链接,比如www.baidu.com;
- 浏览器向百度服务器发送了一个访问请求;
- 百度服务器接收到这个访问请求之后进行处理和解析,知道客户端是想要访问网站;
- 百度服务器返回对应的响应给浏览器,包含了页面的源代码等内容;
- 浏览器再对其进行响应解析;
- 浏览器将网页呈现出来。
互联网的基础:TCP/IP协议族
互联网的的关键是通信,而通信的关键则是通信协议。
说句题外话,有段时间,联想5G投票事件闹得沸沸扬扬,除了民族情绪,更多的还是对通信协议的争夺,谁掌握了通信协议,谁就掌握了通信的核心。
计算机之间的通信协议是TCP/IP协议族,通信协议定义了通信的基本问题。
比如:由哪一边先发起通信、使用哪种语言进行通信、数据传输顺序是怎么样的、怎样结束通信等规则,这些规则称为协议(protocol)。通过这些协议,不同的计算机、手机甚至智能手表之间都可以互相通信。
“族”的意思是很多种协议,比如TCP、UDP、IP、FTP、HTTP、ICMP等都属于 TCP/IP 族内的协议。这些协议本身又可以划分为不同的层次,大致可以分为4层,分别是:应用层、传输层、网络层和链路层。
当然也有不同的划分方式,不同的划分方式大同小异,没有本质的区别。
1)应用层
应用层负责传送各种最终形态的数据,是直接与用户打交道的层,典型协议是HTTP、FTP等。
2)传输层
传输层负责传送文本数据,传输层有两个性质不同的协议,分别是 TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Data Protocol,用户数据报协议)。
3)网络层
网络层负责分配地址和传送数据,主要协议是IP协议。
IP地址(Internet Protocol Address)是指:互联网协议地址,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异,用来在网络中标记一台电脑的一串数字,比如192.168.1.1。
4)链路层
链路层向该层用户提供透明的和可靠的数据传送基本服务。
透明性是指:该层上传输的数据的内容、格式及编码没有限制,也没有必要解释信息结构的意义;可靠的传输使用户免去对丢失信息、干扰信息及顺序不正确等的担心。
你可能会感到奇怪,为什么要层次化呢?
- 在保证层次之间接口不变的情况下,层次内部可以改动,不至于“牵一发而动全身”
- 降低了开发的复杂度,开发的过程中,也只需要关注某一层的协议,而不需要深入了解所有的协议。
数据是如何流动传输?
数据发送的时候依次经过应用层、传输层、网络层、链路层,之后通过光纤等硬件传送给接收端。
接收端的链路层接收到数据,并依次通过网络层、传输层、最终到达应用层,进行数据处理。
首先,作为发送端的客户端在应用层(HTTP 协议)发出的 HTTP请求(比如想要访问http://www.baidu.com),并生成HTTP数据。
- 为了传输方便,在传输层(比如TCP 协议)把从应用层处收到的数据(HTTP 数据)进行封装,之后转发给网络层。
- 在网络层(IP 协议),增加作为通信目的地的地址后转发给链路层。
- 给这些数据附加上以太网数据并进行发送处理,生成的以太网数据将通过物理层传输给接收端。
- 接收端在链路层接收到数据,依次往上层传输,直至应用层。当传输到应用层,才能算真正接收到由客户端发送过来的 HTTP 请求。
HTTP是啥?
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)是用于服务器传输超文本到本地浏览器的传送协议。HTTP是TCP/IP协议族的一部分,属于应用层的面向对象的协议,由于其简捷、快速的方式,受到了广泛的应用。
HTTP协议工作于客户端-服务端架构上,客户端向服务器发送所有请求,服务器根据接收到的请求后,向客户端发送响应信息。
HTTP协议具有以下特点:
- HTTP协议简单快速,客户端向服务器请求服务时,只需传送请求方法和路径。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
- HTTP系统通信灵活,允许传输任意类型的数据对象。比如:文字、图片、音频和视频等内容,这也是我们可以在浏览器或者手机APP查看各种音频、视频的原因。
- HTTP协议面向无连接通信,面向无连接是指通信双方不需要事先建立一条通信线路,而是把每个带有目的地址的包送到线路上,由系统自主选定路线进行传输。这就像我们做出租车的时候,只会告诉司机目的地,并不需要跟司机说走哪条路。
TCP、UDP、Socket
TCP
TCP(transport control protocol,传输控制协议)是面向连接的、可靠的流协议。
流就是指不间断的数据,你可以把它想象成排水管中的水流。
面向连接,是指发送数据之前必须在两端建立连接。建立连接,为数据的可靠传输打下了基础。
可靠的意思是信息不会丢失,当一台计算机想要与另一台计算机通讯时,两台计算机之间的通信需要畅通且可靠,这样才能保证正确收发数据。比如:查收电子邮件的时候,有时候差一个字,意思可能就不一样了,所以要保证每一个字都能够接收到。
在技术实现上,TCP为了保证报文传输的可靠,就给每个包一个序号,序号也保证了传送到接收端实体的包的按序接收。接收端接受到数据之后,也会向发送端发送一个确认的信息(Acknowledgement ,ACK)。如果发送端在一定时间内没有收到接收端返回的ACK,那么发送端会重新发送数据,保证通信的可靠性。
UDP
UDP(user datagram protocol,用户数据报协议)与TCP协议一样用于处理数据包,是一种无连接,面向消息的,提供高效率服务的协议。
UDP是面向无连接的协议, UDP不需要在发送数据前进行建立连接,想发数据就可以开始发送了。有时候,接收端还没有准备好,发送端就开始发送数据了!
UDP也没有数据拆分和编号操作,一股脑直接发送过去了。特别是在网络传输状况较差的时候,发送端只顾着发送数据,接收端可能压根没有接受到数据。
但UDP这样做也有好处,就是传输速度快,TCP在传输之前要建立连接,传输过程中还要编号。接收端接收到所有编号之后,重新组装成信息,需要花费不少时间,在对时间较高的场景,这样做明显会带来较长的时延。
所以,UDP常用在对实时性较高的通信领域,比如:视频会议,这些情况对实时性要求较高,即使丢失了一些数据,也不影响接受信息。
TCP提供面向连接的可靠服务 ,UDP提供无连接的不可靠的服务。对数据准确性要求高,速度可以相对较慢的,可以选用TCP,对实时性要求高的场景可以使用UDP。
Socket
除了TCP/IP,我们可能也会听说过Socket。
Socket(套接字) 是对 TCP/IP 协议的封装,Socket 只是个接口(API)不是协议,通过 Socket 我们才能使用 TCP/IP 协议。
创建 Socket 接口的时候,需要指定传输层协议,可以是 TCP 或者 UDP,当用 TCP 连接,该Socket就是个TCP连接,反之亦然。
状态码:404
服务器响应客户端请求的时候,会返回HTTP状态码(HTTP Status Code)。状态码是表示服务器响应状态的3位数字代码,表示访问请求已经被服务器接收、理解并接收。
状态码可以分为下面5类:
- 1xx:指示信息–表示请求已接收,继续处理;
- 2xx:成功–表示请求已被成功接收、理解、接受;
- 3xx:重定向–要完成请求必须进行更进一步的操作;
- 4xx:客户端错误–请求有语法错误或请求无法实现;
- 5xx:服务器端错误–服务器未能实现合法的请求。
下面是几个比较常见的状态码。
1)200:OK
请求已成功,出现此状态码是表示正常状态。
2)403:Forbidden
服务器已经理解请求,但是拒绝执行它,通常是服务器文件权限设置导致,比如:用户无权访问。
3)404:Not Found
用户最常见的状态码是404,即请求失败,通常是访问的资源在服务器中不存在。用户没有找到自己需要的资源,给用户的体验很不好,自定义404错误页面是提高用户体验的常见做法。
当用户访问的资源不存的时候,不是直接返回404,而是指向一个设计好的html 文件,有些网站甚至会为404设置个小游戏,作为彩蛋。
比如:游戏公司暴雪的404网页延续了其冷酷的设计,一张被锤子砸得面目全非的网页告诉用户:你真的走错路了。
八卦:下载那些事儿
带宽与网速
我们去中国电信、中国联通、中国移动办理宽带网络的时候,带宽通常是10M、20M,但安装完成后,下载速度却可能只有1M/s,远远达不到所说的10M。是运营商欺骗了我们么?带宽、网速是什么,又有什么关系呢?
- 带宽是数据传输的速度,单位是比特/秒(bps),10M=10Mbps。
- 网速是数据传输的速度,但是单位与带宽的单位不同,单位是字节/秒(B/s),1MB/s=1024KB/s 。
比特是信息的最小单位,1字节=8比特,1字节/秒=8比特/秒。因此, 10M带宽=1.25MB/s网速,1M带宽=0.125MB/s=128KB/s,运营商提供的10M网络,转换成网速也就是1.25M/s,跟我们日常的体验相符,这也算是运营商的“小诡计”了。
带宽成本
对普通用户而言,10M的宽带,每个月的上网费用就要几十块钱。不只是对普通用户,带宽成本对互联网公司而言同样是巨大的成本,特别是对于各大视频网站而言,带宽成本是非常巨大的运营成本。
根据阿里云提供的数据,按流量计费,要0.8元/G,一部电影通常在2G左右,下载一部电影就需要 1.6元,这个数据看起来可能不大,但考虑到用户规模,数据就会变得很大了。如果有100万个用户,每个用户每天看一部电影,每天的带宽成本可能就有160万元,这也是视频网站难以盈利的重要原因。
为了减低带宽成本,互联网公司也是想尽办法,比如:百度网盘会对非会员限速,巨大的带宽成本是百度网盘这么做的重要原因。
面对用户对限速的质疑,百度网盘回应,“作为一款免费的云存储产品,每年的服务器成本和带宽成本是硬伤啊。百度网盘存活着为广大用户提供免费的空间内存已经是一笔需每年持续支出的高额成本。除此之外,还有服务成本和带宽成本,宝宝们虽然已经为家里的网络网速买过单,但是当宝宝们打开百度网盘上传和下载文件时,我们还需要为这些文件传输时的带宽进行支付,用户文件传输时带宽越大我们需要支付的费用越高”。
即使是财大气粗的百度公司,也要考虑到昂贵的带宽成本,带宽成本始终是高流量网站需要面对的问题。
P2P
提高下载速度就要增加带宽,增加带宽,运营成本也随之提高;如果不增加带宽,下载速度就会降低,用户体验很差。
有没有什么办法可以解决成本和下载速度之间的矛盾呢?
P2P是个好主意,这里的P2P不是互联网金融的P2P,而是点对点(peer to peer)通信的网络技术。P2P依赖网络中参与者的计算能力和带宽,而不是把依赖都聚集在较少的几台服务器上,互联网金融的P2P借鉴了这个技术概念。
定义有些拗口,我们举个例子就明白了。
传统下载方式是从服务器端下载文件到客户端,由于是从一台服务器下载,服务器所提供的带宽是一定的,因此下载人越多速度越慢。假设服务器的带宽是100M,即12500kb/s。有100台客户端连接,那么每一台分享到的带宽就是125kb/s,难怪下载速度这么慢!
为了避免服务端带宽的限制, P2P下载应运而生。与传统下载不同,P2P下载是用户越多,下载越快,这是因为P2P用的是一种共享的方式提供下载。
我们可能也会听说过BT,BT全名叫”BitTorrent”, BT和P2P有些差别,P2P指的是数据的一种传送方式,而BT是应用这种方式的软件。但我们大多数人接触较多的都是P2P,这里就用P2P直接使用P2P代指P2P和BT了,请读者知晓。
我们以迅雷下载为例,说明P2P的下载过程。
比如:用户甲从网上下载《流浪地球》,得到一个下载地址A,然后使用迅雷下载,下载地址A就会被迅雷收集在服务器上,另外还有一个用户乙使用迅雷从另外一个网站下载《流浪地球》,迅雷同样会收集这个下载地址B。
这时候,迅雷就有了(下载地址A,下载地址B)两个下载地址,同时用户甲,用户乙也会作为新的下载地址(行话叫做’“ 肉鸡”),此时,迅雷就有(下载地址A,下载地址B,用户甲,用户乙)四个下载地址。
当新用户丙使用迅雷下载《流浪地球》的时候,就可以分别从下载地址A,下载地址B,用户甲,用户乙这四个地方同时下载不同的片段,等下载完成之后再拼成一部完整的电影。
当然,用户丙在下载的过程中,也给其他人提供下载地址,此时迅雷的数据库里有(下载地址A、下载地址B、用户甲、用户乙、用户丙)五个下载地址,这也是迅雷下载速度较快的原因。不只是迅雷,快播、电驴、BT下载等P2P下载也是类似的原理。
通过P2P下载,在不增加服务器带宽的时候,却能提高下载速度!网络真奇妙!
本文由@李艳宾 原创发布于人人都是产品经理,未经许可,禁止转载
题图来自Unsplash, 基于CC0协议
最后一点不是很明白,下载地址A、下载地址B、用户甲、用户乙作为用户丙的下载地址,那用户甲或者用户乙关机了,那用户丙下载的电影不是少了一段?
下载那段内容,异常精彩!感谢
获益匪浅
最后一段写的是这牛逼,没想到下载行业程序这么牛逼
作者辛苦了 写的真好
通俗易懂
嗯,看不懂
是专业名词、概念太多,而平时基本接触不到这些东西吗?
加个鸡腿
作者辛苦了