数据传输原理(上)—— 主机部分 – 作者:chenhh

1620812534_609ba2f62144e1894dff6.png!small?1620812534564

应用层交互过程举例

DNS

DNS为域名系统,用于将IP与域名进行关联。区分互联网上的某一台主机使用的是IP,但是因为IP不是便于人类记忆的东西,而域名便于我们人类记忆,所以需要DNS讲IP和域名进行关联。

下面用查询www.test.com的过程,说明下DNS的主要工作过程:

1、本地PC要访问www.test.com,首先会查询下本地PC是否有缓存,如果没有缓存,将向自己配置的首选DNS服务器询问是否知道www.test.com的IP

2、首选DNS服务器如果不知道,将会向根域服务器询问是否知道com DNS服务器的IP

3、首选DNS服务器从根域DNS服务器拿到com DNS服务器的IP后,向com DNS服务器发起询问是否知道test.com DNS服务器

4、首选DNS服务器从com DNS服务器拿到test.com服务器的IP后,继续向test.com服务器发起询问是否知道www.test.com的服务器IP

5、首选DNS服务器从test.com域名服务器拿到www.test.com的服务器IP后,将www.test.com的服务器IP返回给本地PC

6、本地PC从首选DNS服务器上拿到www.test.com的IP后,向www.test.com的WEB服务器发起访问,整个DNS过程结束

HTTP

一次完整的HTTP请求响应交互的过程一般分为如下4个步骤:
1、客户端和服务器端建立连接
2、客户端发送请求数据到服务器端(HTTP 协议)
3、服务器端接收到请求后,进行处理,然后将处理结果响应客户端(HTTP 协议)
4、关闭客户端和服务器端的连接(HTTP1.1 后不会立即关闭)

HTTPS

因为HTTP的交互过程请求和响应均为明文的,容易被窃听、篡改、劫持,所以人们想到了在HTTP数据上使用TLS加密后再传递给TCP层进行封装。

1620916533_609d3935a570a267da119.png!small?1620916537734

其交互过程如下:

1、客户端发送clienthello包,该包包含客户端支持的TLS版本、随机数(client random)(用于后续生成对话的密钥)以及自己支持的加密算法

2、服务端接收到clienthello包后,发送serverhello包,该包包含选择的TLS版本,随机数(server random)(用于后续生产的对话密钥)、选择的加密算法、自己的服务器证书

3、客户端收到serverhello包后,首选校验服务器证书的有效性,并利用client random和server random以及协商好的算法生成构造密钥的字符串,并使用服务端的公钥加密发送给服务端,此时客户端已经有了密钥=(client random+server random+构造密钥的字符串+协商好的算法)

4、服务端接收到后,用自己的私钥解密得到构造密钥的字符串,此刻服务端也有了密钥=(client random+server random+构造密钥的字符串+协商好的算法),之后双方发生信息的加解密过程就可以用密钥进行加密了

websocket

WebSocket协议和HTTP协议一样,也是在TCP协议层之上的应用层协议,刚接触WebSocket协议的人通常会有个疑问:都有HTTP这个应用层协议了,为啥还要再搞出一个WebSocket协议?
事实上,HTTP是无状态的,并且只能支持单向通信,即都是浏览器向服务端发送HTTP请求,然后得到一个响应。而websocket支持双向通信,即服务端能向客户端主动发送信息。

1620813892_609ba844b9c813e728701.png!small?1620813894821

其交互过程如下:

客户端请求报文

1620916863_609d3a7fa9890fb62b2d6.png!small?1620916882778

与传统 HTTP 报文不同的地方:

1620916873_609d3a8983e416085cf9a.png!small?1620916882776

这两行表示发起的是 WebSocket 协议。

1620916888_609d3a98f12b508076c4d.png!small?1620916912436

Sec-WebSocket-Key 是由浏览器随机生成的,提供基本的防护,防止恶意或者无意的连接。

Sec-WebSocket-Version 表示 WebSocket 的版本,最初 WebSocket 协议太多,不同厂商都有自己的协议版本,不过现在已经定下来了。如果服务端不支持该版本,需要返回一个 Sec-WebSocket-Versionheader,里面包含服务端支持的版本号。

然后我们来看看服务端的响应报文:

1620916769_609d3a21b9d263cc390f0.png!small?1620916793456

我们一行行来解释:
首先,101 状态码表示服务器已经理解了客户端的请求,并将通过 Upgrade 消息头通知客户端采用不同的协议来完成这个请求;
然后, Sec-WebSocket-Accept 这个则是经过服务器确认,并且加密过后的 Sec-WebSocket-Key;
最后, Sec-WebSocket-Protocol 则是表示最终使用的协议。

Sec-WebSocket-Accept 的计算方法:
将 Sec-WebSocket-Key 跟 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 拼接;
通过 SHA1 计算出摘要,并转成 base64 字符串。
注意: Sec-WebSocket-Key/ Sec-WebSocket-Accept 的换算,只能带来基本的保障,但连接是否安全、数据是否安全、客户端 / 服务端是否合法的 ws 客户端、ws 服务端,其实并没有实际性的保证。

应用层与传输层的接口socket

1620814131_609ba933d2009fa079366.png!small?1620814132298

socket工作过程

1620814172_609ba95c00f673df0f65f.png!small?1620814173448

传输层–提供进程到进程的通信

1620814683_609bab5be6954ba51f43f.png!small?1620814685086

传输层协议–TCP、UDP

TCP的作用:该协议主要用于在主机间建立一个虚拟连接,以实现高可靠性的数据包交换。IP协议可以进行IP数据包的分割和组装,但是通过IP协议并不能清楚地了解到数据包是否顺利地发送给目标计算机。而使用TCP协议就不同了,在该协议传输模式中在将数据包成功发送给目标计算机后,TCP会要求发送一个确认;如果在某个时限内没有收到确认,那么TCP将重新发送数据包。另外,在传输的过程中,如果接收到无序、丢失以及被破坏的数据包,TCP还可以负责恢复。
UDP的作用:UDP协议与TCP协议一样用于处理数据包,在OSI模型中,两者都位于传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。但也因为没有TCP确认、重传等机制的开销,所以在网络上传输效率会更高。

1620918615_609d4157dea2af91e5a43.png!small?1620918623388

常见服务端口:

补充:保护消息边界,就是指传输协议把数据当作一条独立的消息在网上 传输,接收端只能接收独立的消息。也就是说(UDP)存在保护消息边界,接收 端一次只能接收发送端发出的一个数据包;而面向流(TCP)则是指无保护消息保护边界的,如果发送端连续发送数据,接收端有可能在一次接收动作中,会接收两个或者更多的数据包。

TCP/UDP端口

TCP、UDP端口有什么用呢? 我们知道,一台拥有IP地址的主机可以提供许多服务,比如Web服务、FTP服务、SMTP服务等,这些服务完全可以通过1个IP地址来实现。 那么,主机是怎样区分不同的网络服务呢?显然不能只靠IP地址,因为IP 地址与网络服务的关系是一对多的关系。 实际上是通过“IP地址+端口号”(套接字)来区分不同的服务的。

1620917567_609d3d3fcd66ab3d87010.png!small?1620917581221

通信双方TCP交互过程

1620814874_609bac1a62247541cac6b.png!small?1620814875676

TCP确认机制

TCP为传输的每个字节分配了一个序号Sequence Number ,并期望从接收端的TCP得到一个肯定的确认(ACK)。因为数据按块(TCP报文段)的形式传输,所有TCP报文段中的每一个数据字节的序列号被发送到目的主机。当报文无序到达时,接收端TCP使用序列号来重排TCP报文段,并删除重复发送的报文段。 TCP的确认是对接收到的数据的最高序号的确认,并向发送端返回一个下次期望收到的第一个数据字节的序号。

1620814904_609bac386d57bb1be59fa.png!small?1620814908613

TCP重传机制

1620814932_609bac541f9a9c98199ba.png!small?1620814932833

TCP流控机制—滑动窗口

TCP头里有一个字段叫Window,又叫Advertised-Window,这个字段是接收端告诉发送端自己还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来。

1620814983_609bac877b4651ed74676.png!small?1620814987410

1620814978_609bac825699a59b9d602.png!small?1620814987409

TCP拥塞控制

TCP不是一个自私的协议,当拥塞发生的时候,要做自我牺牲。就像交通阻塞一样,每个车都应该把路让出来,而不要再去抢路了。关于拥塞控制的论文请参看《Congestion Avoidance and Control》(PDF) 。拥塞控制主要是四个算法:1)慢启动,2)拥塞避免,3)拥塞发生(快重传),4)快速恢复。

1620918831_609d422f79979d54765c5.png!small?1620918836569

1620918822_609d4226b856a3cc352ea.png!small?1620918836572

TCP标志位

不同的标志位(或组合)代表不同的tcp数据包类型,如syn包、syn/ack包、ack包、ack/psh包、rst包、fin包等。 主机接受到不同的tcp包进入不同的tcp状态,并响应不同的tcp包。

1620815060_609bacd468071db24caf7.png!small?1620815064245

1620815058_609bacd2b7bcdbb9bcff6.png!small?1620815064244

TCP连接状态(状态机)

网络上的传输是没有连接的,包括TCP也是一样的。而TCP所谓的“连接”,其实只不过是在通讯的双方维护一个“连接状态”,让它看上去好像有连接一样。

1620815102_609bacfe86df4b39532bf.png!small?1620815104740

HTTP协议的整个数据包交互过程:

1620815108_609bad04dc1d443f0413b.png!small?1620815113846

网络层–提供主机到主机的通信

1620815210_609bad6a9fa6d8cc798bd.png!small?1620815213722

网络层–IP地址

1620815257_609bad9990ec1fdc026eb.png!small

网络层–IP地址分类

1620815288_609badb8bcc7cd8b7497c.png!small?1620815289554

网络层–IP地址子网划分

主机地址和掩码地址进行二进制与运算,得到网络号。 通信双方是否在同一网段就看网络号是否一样。

1620815324_609baddc82faf8656020c.png!small?1620815324933

网络层–路由

1620815342_609badeec3dfd375bfae8.png!small?1620815350009

网络层–路由表(选路的依据)

如下是windows上的路由表:

网络层–路由匹配

1620815417_609bae397eac6aceb4ba7.png!small?1620815419829

网络层–数据包发送/接收过程

1620815442_609bae521d661e653c232.png!small?1620815443449

网络层–防火墙

1620815530_609baeaa2b0848b6d24ea.png!small?1620815534104

netfilter在网络层注册了5个钩子函数(上图红色部分) 用于对报文进行跟踪记录、过滤、修改、NAT等操作

网络层—防火墙框架

1620815575_609baed7d3d6c3f2601cd.png!small?1620815576362

网络层–防火墙完整处理过程

1620815646_609baf1e5faeb0a4afdb2.png!small?1620815646957

网络层–防火墙命令格式

1620815672_609baf38eb2cb6fe9b780.png!small?1620815685657

1620815673_609baf39d8a0a83082049.png!small?1620815685655

物理层与数据链路层–提供结点到结点的通信

1620815706_609baf5a382a41413c714.png!small?1620815706987

物理层与数据链路层–网卡及网卡驱动

1620815755_609baf8be2eab8e7eb998.png!small?1620815756390

1620815775_609baf9f5b6d6396c031e.png!small?1620815778187

ARP与RARP协议

在一个稳定的网络中,IP地址和MAC地址是成对出现的。如果一台计算机要和网络中另一外计算机通信,那么要配置这两台计算机的IP地址,MAC地址是网卡出厂时设定的,这样配置的IP地址就和MAC地址形成了一种对应关系。在数据通信时,IP地址负责表示计算机的网络层地址,网络层设备(如路由器)根据IP地址来进行操作;MAC地址负责表示计算机的数据链路层地址,数据链路层设备(如交换机)根据MAC地址来进行操作。IP和MAC地址这种映射关系由ARP(Address Resolution Protocol,地址解析协议)协议完成。

1620815810_609bafc2861a09c70169c.png!small?1620815810992

为什么要同时具备IP和MAC地址?

信息传递时候,需要知道的其实是两个地址:终点地址(Final destination address)、下一跳的地址(Next hop address) IP地址本质上是终点地址,它在跳过路由器(hop)的时候不会改变,而MAC地址则是下一跳的地址,每跳过一次路由器都会改变。这就是为什么还要用MAC地址的原因之一,它起到了记录下一跳的信息的作用。分层实现如果在IP包头(header)中增加了”下一跳IP地址“这个字段,在逻辑上来说,如果IP地址够用,交换机也支持根据IP地址转发(现在的二层交换机不支持这样做),其实MAC地址并不是必要的。但用MAC地址和IP地址两个地址,用于分别表示物理地址和逻辑地址是有好处的。这样分层可以使网络层与链路层的协议更灵活地使用,网络层不一定非要用IP协议,链路层也不一定非用以太网协议。 另外,如果只有MAC,没有IP,则需要向全世界发送arp广播包以获取目的mac,网络带宽瞬间会饱和。

物理层实现–传输光、电、无线信号

1620815858_609baff20d278150dcf1b.png!small?1620815859408

来源:freebuf.com 2021-05-13 23:57:10 by: chenhh

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论