开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第25天,点击查看活动详情
1.1.网络基础架构
-
Client/Server 信息传输流程:完成一次网络通信,大致要经过以下 5 个步骤。
- 客户端产生数据,存放于客户端应用的内存中,然后调用接口将自己内存中的数据发送/拷贝给操作系统内存。
- 客户端操作系统收到数据后,按照客户端应用指定的规则 (即协议) ,调用网卡并发送数据。
- 网络传输数据。
- 服务端应用调用系统接口,想要将数据从操作系统内存拷贝到自己的内存中。
- 服务端操作系统收到指令后,使用与客户端相同的规则 (即协议) 从网卡读取数据,然后拷贝给服务端应用。
1.2.TCP/IP五层模型
-
网络模型一般有两类,TCP/IP五层或四层模型,OSI七层模型。
常见设备 TCP/IP四层模型 TCP/IP五层模型 OSI七层模型 四层交换机、四层路由器------------应用层------------应用层------------应用层: 各种应用程序的协议 ------------表示层: 信息的语义语法以及他们的关联,如加密解密、转换翻译、压缩解压缩。 ------------会话层: 不同机器上的用户之间建立及管理会话 路由器、三层交换机---------------传输层------------传输层------------传输层: 接收上一层的数据,在必要的时候把数据进行分割,将这些数据交给网络层 数据链路层----------------------网络层------------网络层------------网络层: 控制子网的运行,如逻辑编址、分组传输、路由选择 物理层-------------------------网络接口层---------数据链路层---------数据链路层: 物理寻址,同时将原始比特流变为逻辑传输线路 ---------物理层------------物理层: 机械、电子、定时接口通信信道上的原始比特流传输
1.2.1.物理层
- 物理层主要是基于电器特性发送高低电平信号,指的是电路中某一点电压的高低状态,在网络信号中高电平用数字 1 表示,低电平用数字 0 表示。
1.2.2.数据链路层
-
由于单纯的电平信号 0 和 1 没有任何意义,在实际应用中,我们会将电平信号进行分组处理,多少位一组、每组代表的含义,这样数据才有具体的含义。数据链路层的功能就是定义电平信号的分组方式。
-
以太网协议:数据链路层使用以太网协议进行数据传输,基于 MAC 地址的广播方式实现数据传输,只能在局域网内广播。早期各个公司都有自己的分组方式,之后形成了统一的标准,即以太网协议 Ethernet。以太网由一组电平信号构成一个数据包,叫作帧,每一数据帧由报头 Head 和数据 Data 两部分组成:
- Head:固定18字节,其中发送者/源地址6字节,接收者/目标地址 6 字节,数据类型 6 字节。
- Data:最短46字节,最长1500字节。
数据包的具体内容格式为:Head 长度与Data长度之和最短 64 字节,最长 1518 字节
-
MAC 地址:每块网卡出厂时都被印上一个世界唯一的 MAC 地址,它是一个长度为 48 位的二进制数,通常用 12 位十六进制数表示 (前 6 位是厂商编号,后 6 位是流水线号)
Ethernet 规定接入 Internet 的设备必须配有网卡,发送端和接收端的地址便是指网卡的地址,即 MAC 地址。Head 中的地址便是 MAC 地址。
-
Broadcast 广播:通过 MAC 地址同一网络内的两台主机可以进行通信 (一台主机通过 ARP 协议获取另外一台主机的 MAC 地址) 。计算机按照固定协议格式以广播的方式发送以太网包给所有计算机,接收的计算机收到发来的数据包,拆开后如果发现目标 MAC 地址不是本身就会丢弃,如果是本身就响应。
1.2.3.网络层
-
如果所有的通信都采用以太网的广播方式,那么一台机器发送的数据包全世界都会收到,这就不仅仅是效率低的问题了,这会是一种灾难。全世界的大网络由一个个小的彼此隔离的局域网组成,以太网包只能在一个局域网内发送,一个局域网是一个广播域,跨广播域通信只能通过路由转发。
由此得出结论:必须找出一种方法来区分哪些计算机属于同一广播域。如果是就采用广播的方式发送,如果不是就采用路由的方式发送 (向不同广播域/子网分发数据包),MAC 地址是无法区分的,网络层就是用来解决这一问题的。网络层的作用就是引入一套新的地址来区分不同的广播域/子网,这套地址叫作网络地址。
-
IP协议:规定网络地址的协议叫作 IP (Internet Protocol,网际互联协议) ,它定义的地址称为 IP 地址。广泛采用 v4 版本即 IPv4 ,规定网络地址由 32 位二进制数表示。一个 IP 地址通常写成四段十进制数,例如 172.16.10.1,其取值范围为:0.0.0.0~255.255.255.255。
IP 数据包也分为 Head 和 Data 两部分,无须为 IP 数据包定义单独的栏位,直接放入以太网包的 Data 部分即可。
- Head (IP头部):长度为 20~60 字节。
- Data (IP数据):最长为 65515 字节。
以太网数据包的 Data 部分,最长只有 1500 字节。因此,如果IP数据包超过 1500 字节,它就需要分割成几个以太网数据包,分开发送。
-
子网掩码:表示子网络特征的一个参数。根据子网掩码就能判断任意两个 IP 地址是否处于同一个子网络。方法是将两个 IP 地址与子网掩码分别进行按位与运算,比较结果是否相同,如果相同,就表明它们在同一个子网络中,否则就不在。
-
ARP协议:计算机通信方式是广播的方式。所有上层的数据包到最后都要封装到以太网头,然后通过以太网协议发送。在谈及以太网协议的时候,我们已经了解到,通信基于 MAC 地址的广播方式实现的,计算机在发送数据包时,获取自身的 MAC 地址是容易的,获取目标主机的 MAC 地址,需要通过ARP (Address Resolution Protocol,地址解析协议) 来实现。
1.2.4.传输层
-
网络层的 IP 地址帮我们区分子网,以太网层的 MAC 地址帮我们找到主机,通过IP地址和MAC地址找到了一台特定的主机,之后将通过端口,即应用程序与网卡关联的编号,标识主机上的应用程序。传输层就是用来建立端口到端口的通信机制的。
-
TCP协议:TCP (Transmission Control Protocol,传输控制协议) 是一种可靠传输协议,TCP 数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常 TCP 数据包的长度不会超过 IP 数据包的长度,以确保单个TCP数据包不必再分割
--------------------------------------- | 以太网头部 | IP头部 | TCP头部 | TCP数据 | --------------------------------------- 其中,TCP头部和TCP数据部分共同组成了IP的数据部分,而IP头部和IP数据部分组成了以太网的数据部分。报文结构:TCP 报文是 TCP 层传输的数据单元,也叫作报文段。
-
端口号:用来标识同一台计算机的不同应用进程。
- 源端口:源端口和IP地址的作用是标识报文的返回地址。
- 目的端口:目的端口指明接收方计算机上的应用程序接口。
TCP 报头中的源端口号和目的端口号同IP数据包中的源 IP 地址和目的 IP 地址唯一确定一条 TCP 连接。
-
序号和确认号:TCP可靠传输的关键部分。序号是本报文段发送的数据组的第一个字节的序号。在 TCP 传送的流中,每一个字节都有一个序号。例如:一个报文段的序号为 300,此报文段数据部分共有 100 字节,则下一个报文段的序号为 400。所以序号确保了 TCP 传输的有序性。确认号,即 ACK,指明下一个期待收到的字节序号,表明该序号之前的所有数据已经正确无误地收到。确认号只有当 ACK 标志为 1 时才有效。比如建立连接时,SYN 报文的 ACK 标志为 0。
-
数据偏移/头部长度:4 位。由于头部可能含有可选项内容,TCP报头的长度是不确定的,报头不包含任何任选属性则长度为 20 字节,4 位头部长度属性所能表示的最大值为 1111 ,转化成十进制为 15,15 × 32 / 8 = 60,故报头最大长度为 60 字节。头部长度也叫数据偏移,是因为头部长度实际上指示了数据区在报文段中的起始偏移值。
-
保留:为将来定义新的用途保留,现在一般设置为 0 。
-
标志位:URG、ACK、PSH、RST、SYN、FIN,共 6 个,每一个标志位都表示一个控制功能,具体含义如下表所示。
字段 中文名称 含义 URG 紧急指针标志 为 1 表示紧急指针有效,为 0 则忽略紧急指针。 ACK 确认序号标志 为 1 表示确认号有效,为 0 表示报文中不含确认信息,忽略确认号属性。 PSH 接收信号标志 为 1 表示带有 Push 标志的数据,指示接收方在接收到该报文段以后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队。 PST 重置连接标志 用于重置由于主机崩溃或其他原因而出现错误的连接,或者用于拒绝非法的报文段和拒绝连接请求。 SYN 同步序号标志 用于建立连接过程,在连接请求中,SYN=1 和 ACK=0 表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1 和 ACK=1。 FIN 完成标志 用于释放连接,为 1 表示发送方已经没有数据发送了,即关闭本方数据流。 -
窗口:滑动窗口大小,用来告知发送端接收端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。窗口大小是一个 16 位属性,因而窗口大小最大为 65535。
-
校验和:奇偶校验,此校验和针对整个 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位属性进行计算所得。由发送端计算和存储,并由接收端进行验证。
-
紧急指针:只有当 URG 标志为 1 时紧急指针才有效。紧急指针是一个正的偏移量,和顺序号属性中的值相加表示紧急数据最后一个字节的序号。TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式。
-
选项和填充:最常见的可选属性是最长报文大小,又称为 MSS (Maximum Segment Size) ,每个连接方通常都在通信的第一个报文段 (为建立连接而设置 SYN 标志为 1 的那个段) 中指明这个选项,它表示本端所能接收的最大报文段的长度。选项长度不一定是 32 位的整数倍,所以要加填充位,即在这个属性中加入额外的零,以保证 TCP 头部长度是 32 位的整数倍。
-
数据部分:TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 头部。如果一方没有数据要发送,也使用没有任何数据的头部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。
TCP报文结构 16位 16位 源端口 | 目的端口 序号 确认号 数据偏移 | 保留 | 标志位 | 窗口 校验和 | 紧急指针 选项(长度可变) | 填充 数据部分
交互:传输连接包括三个阶段:连接建立、数据传送和连接释放。传输连接管理就是对连接建立和连接释放过程的管控,使其能正常运行,通信双方能够确知对方的存在、可以允许通信双方协商一些参数 (最大报文段长度、最大窗口大小等) 、能够对运输实体资源进行分配 (缓存大小等) 。
-
TCP开始数据传输的三次握手
第一次握手:建立连接时,客户端发送 SYN 包 (在TCP 标志位中 syn=1) 到服务器,并进入 SYN_SENT 状态,等待服务器确认。
第二次握手:服务器收到 SYN 的数据包,必须确认客户端的 SYN 包 (TCP报文标志位 ack=x+1) ,同时自己也发送一个 SYN 包(syn=k),即 ACK + SYN 包,此时服务器进入 SYN_RECV 状态此时服务器进入 SYN_RECV 状态。
第三次握手:客户端收到服务器的 SYN+ACK 包,向服务器发送确认包 ACK (ack=y+1) ,此包发送完毕,客户端和服务器进入 ESTABLISHED (TCP 连接成功) 状态,完成三次握手。
-
TCP完成数据传输的四次挥手
第一次挥手:客户端进程发出连接释放报文,并且停止发送数据。释放数据报文头部,FIN=1,其序列号为 seq=u (等于前面已经传送过来的数据的最后一个字节的序号加1) ,此时,客户端进入 FIN_WAIT_1 (终止等待1) 状态。TCP 规定,FIN 报文段即使不携带数据,也要消耗一个序号。
第二次挥手:服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号 seq=v,此时,服务器就进入了 CLOSE_WAIT (关闭等待) 状态。TCP 服务器通知高层的应用进程,客户端向服务器方向的连接就被释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接收。这个状态还要持续一段时间,也就是整个 CLOSE_WAIT 状态持续的时间。客户端收到服务器的确认请求后,客户端就进入FIN_WAIT_2 (终止等待2) 状态,等待服务器发送连接释放报文 (在这之前还需要接收服务器发送的最后的数据) 。
第三次挥手:服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为 seq=w,此时,服务器就进入了LAST_ACK (最后确认) 状态,等待客户端的确认。
第四次挥手:客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是 seq=u+1,此时,客户端就进入了 TIME_WAIT (时间等待) 状态。此时 TCP 连接还没有释放,必须经过 2×MSL (最长报文段寿命) 的时间 (保证服务端能接收到,且没有数据再次发送过来),当客户端撤销相应的 TCB (Transmit Control Block,传输控制模块) 后,才进入 CLOSED 状态。
TIME_WAIT 状态只会出现在主动发起关闭连接请求的一方。如果该状态过多会占用内存资源和端口,可以通过 Linux 参数设置。
-
-
UDP协议:UDP (User Datagram Protocol,用户数据报协议) 是一种不可靠传输协议,报头部分总共有 8 字节,总长度不超过 65535 字节,正好放进一个 IP 数据包
--------------------------------------- | 以太网头部 | IP头部 | UDP头部 | UDP数据 | --------------------------------------- 其中,UDP头部和UDP数据部分共同组成了IP的数据部分。
注释:
其实,忽略 TCP 报文内容来理解其三次握手和四次挥手过程非常容易:
就三次握手而言,可以理解为客户端和服务端在互相发送接收数据,保证二者都具有发送和接收数据的能力,客户端先发送(客户端发送能力确认),服务端接收并返回确认信息(服务端发送和接收能力确认),客户端接收并返回确认信息(客户端接收能力确认);
而就四次挥手而言,可以理解为服务端和客户端在分别关闭接收通道,第一轮,客户端先发送fin表示自己不再发送数据了,服务端先返回一个ack确认一下就可以关掉服务器自己的读通道了,客户端接收到这个确认命令就可以关闭写通道,注意这个时候服务端还可以向客户端发送数据;第二轮,这个时候服务端可能有数据没发送完,直到发送完毕后也发送一个fin,客户端收到以后,也发送一个确认信号,继而关闭自己的读通道,服务器收到后关闭自己的写通道。
至于其中发送的信息内容,都是附加的记忆,理解其本质,就可以很容易的记忆这个流程。
1.2.5.应用层
-
在日常操作中,用户使用的都是应用程序,应用程序都工作在应用层。可以开发自己的应用程序,数据多种多样,必须规定好数据的组织形式。应用层的功能就是规定应用程序的数据格式。
-
常见协议:
-
DNS协议:DNS 是英文 Domain Name System (域名系统) 的缩写,用来把便于人们使用的机器名字转换为IP地址。
目前顶级域名 TLD (Totel Lead Domination) 分为三大类:国家顶级域名 nTLD 、通用顶级域名 gTLD 和基础结构域名。
域名服务器分为四种类型:根域名服务器、顶级域名服务器、本地域名服务器和权限域名服务器。DNS 使用 TCP 和 UDP 端口 53 。当前,对于每一级域名长度的限制是 63 个字符,域名总长度则不能超过 253 个字符。
-
FTP:FTP (File Transfer Protocol,文件传输协议) 是互联网上使用最广泛的文件传送协议。FTP提供交互式的访问,允许客户指明文件类型与格式,并允许文件具有存取权限。FTP基于TCP工作。
-
SMTP:SMTP (Simple Mail Transfer Protocol,简单邮件传输协议) 规定了在两个相互通信的SMTP进程之间应如何交换信息。SMTP通信的三个阶段:建立连接、邮件传送和连接释放。
-
POP3:POP3 (Post Office Protocol 3,邮件读取协议) 通常被用来接收电子邮件
-
Telnet协议:Telnet协议是一个简单的远程终端协议,也是互联网的正式标准,又称为终端仿真协议。
-
HTTP/HTTPS:HTTP (HyperText Transfer Protocol,超文本传输协议) 是面向事务的应用层协议。它是互联网上能够可靠地交换信息的重要基础。HTTP 使用面向连接的 TCP 作为运输层协议,保证了数据的可靠传输。
HTTP1.0:默认短连接,每次与服务器交互,都需要新开一个连接
HTTP1.1:默认持久连接,只要未断开,就一直保持连接,断点续传,实体主体分块进行传输
HTTP2.0:二进制分帧层,对头部进行压缩,支持多路复用,通过一个单一的TCP连接并行发起多个的请求和响应消息
HTTPS:HTTPS是身披SSL外壳的HTTP。HTTPS是一种通过计算机网络进行安全通信的传输协议,经由HTTP进行通信,利用SSL/TLS建立全信道,加密数据包。HTTPS使用的主要目的是提供对网站服务器的身份认证,同时保护交换数据的隐私与完整性。
- client向server发送请求baidu.com,然后连接到server的443端口,发送的信息主要是随机值1和客户端支持的加密算法。
- server接收到信息之后给予client响应握手信息,包括随机值2和匹配好的协商加密算法,这个加密算法一定是client发送给server加密算法的子集。
- 随即server给client发送第二个响应报文是数字证书。服务端必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面,这套证书其实就是一对公钥和私钥。传送证书,这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间、服务端的公钥,第三方证书认证机构(CA)的签名,服务端的域名信息等内容。
- 客户端解析证书,这部分工作是由客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随即值(预主秘钥)。
- 客户端认证证书通过之后,接下来是通过随机值1、随机值2和预主秘钥组装会话秘钥。然后通过证书的公钥加密会话秘钥。
- 传送加密信息,这部分传送的是用证书加密后的会话秘钥,目的就是让服务端使用秘钥解密得到随机值1、随机值2和预主秘钥。
- 服务端解密得到随机值1、随机值2和预主秘钥,然后组装会话秘钥,跟客户端会话秘钥相同。
- 客户端通过会话秘钥加密一条消息发送给服务端,主要验证服务端是否正常接受客户端加密的消息。
- 同样服务端也会通过会话秘钥加密一条消息回传给客户端,如果客户端能够正常接受的话表明SSL层连接建立完成了
-