【网络】【转】Internet通信(二)

2018-12-19  本文已影响0人  薯条你哪里跑

上文介绍了计算机网络的基础知识和DNS域名解析,本文继续分析DNS域名解析确定接收方的IP地址后如何确定MAC地址,然后建立TCP连接。

我们先对上文做个小结:

确定接受方MAC地址的情况分两种:发出方和接收方是否在同一子网络中。

如何判断发出方和接收方是否在同一子网络?

例如发出方的子网掩码为255.255.255.0,两台计算机IP地址分别为172.16.254.2和172.16.254.1,将子网掩码转为二进制为11111111.11111111.11111111.00000000,两台计算机IP地址转为二进制分别为10101100.00010000.11111110.00000010和10101100.00010000.11111110.00000001。两台计算机IP地分别与子网掩码做AND运算,运算结果转为十进制都是172.16.254.0,那么则表示172.16.254.2和172.16.254.1在同一子网络中。

在同一子网络

注:每次查询接收方MAC地址都会在本地ARP缓存中,根据接收方的IP地址寻找相对应的MAC地址,如果没有找到,则会根据ARP协议在以太网进行广播查找。

在不同子网络

两台计算机不在同一个子网络,无法直接通过ARP协议广播查找,那么只能通过默认网关代为转发,如图。

image.png

例如1号计算机与4号计算机请求通信,发送数据包,他将根据1号计算机的子网掩码判断与4号计算机是否在同一子网络中,发现不在同一子网络,于是就把这个数据包发送到网关A(网关A在计算机加入网络中已确定),网关A通过路由协议,根据路由转发表将该数据包转发至网关B,网关B再转发给4号计算机,4号计算机再做出响应,返回本机的MAC地址并添加到本地的ARP缓存。

至此,知道发出方和接收方的IP地址和MAC地址就可以建立TCP连接了。

查看ARP缓存表

打开命令窗口,输入arp -g或者arp -a,查看本地ARP缓存表,如图


image.png

TCP连接

要分析TCP连接,我们必须先了解TCP协议。

所以,在网络通信下确定双方IP地址和MAC地址后,发出方发出的数据需在传输层经过TCP分割成多个适当大小(约1522字节)的数据包,然后再经网络层IP协议将该数据包转发到接收方实体的传输层。

那么TCP连接是如何建立的?
这里我们将发出方成为客户端,接收方称为服务端。TCP连接的过程分为三步,可简单描述为:

至此,TCP连接建立成功,该过程称为TCP三次握手,具体分析如下。

TCP三次握手

image.png

在分析之前,我们先了解上图的术语含义:

知道以上标志含义后,我们接下来分析TCP三次握手的详细过程:

  1. 建立连接时,客户端向服务端发SYN包(该数据包假设SYN为j,随机产生一个值seq=x),并将该数据包发送给服务端,客户端进入SYN_SENT状态,等待Server确认。
  1. 服务端收到该SYN包,必须先确认客户的SYN,发送一个ACK值为j+1的确认数据包,同时也向客户端发送一个SYN包(假设SYN=k,随机产生一个值seq=y),即发送SYN+ACK包,然后服务端进入SYN_RECV状态
  1. 客户端接收到服务端的SYN+ACK包后,客户端进入ESTABLISHED状态,并对服务端发送的SYN包进行确认,发送确认包ACK(ack=k+1),服务端接收到客户端的ACK包后,也进入ESTABLISHED状态,至此TCP连接成功。

至此,TCP三次握手成功后,TCP连接成功,通信的两台计算机就可使用TCP连接进行数据包的传输,进行网络通信。

TCP数据包传输

首先我们先了解数据包的结构,如下图


image.png

由上图可得出,IP数据包在以太网数据包里面,TCP数据包在IP数据包里面。数据最终会被组装成以太网数据包(包含IP数据包,TCP数据包)在链接层传输,而每个以太网数据包大小约为1522字节。

数据包传输过程与TCP三次握手类似,大致如下:


image.png

防止数据包丢失

image.png

通过以上确认接收的机制,TCP保证了不会发生数据丢失的情况。

慢启动

在Internert通信下,数据的传输速率肯定是越快越好,但是如果数据传输的太快,接收方接收的速率跟不上,那么就很有可能会发生大量数据包丢失的情况,同时也会对发出方的性能造成影响。同时,数据包的传输速率也是不稳定的,带宽小、路由器过热、缓存溢出等许多因素都会对传输速率造成影响。TCP协议为了做到效率与可靠性的统一,设计了一个慢启动(slow start)机制,利用慢启动来控制数据的传输速率。

慢启动的主要作用是当TCP开始在一个网络中传输数据或发现数据丢失并开始重发时,首先慢慢的对网路实际容量进行试探,避免由于发送了过量的数据而导致阻塞。

默认情况下,接收方每次接收TCP 数据包,就要发送一个确认消息ACK包,代表接收确认,同时该ACK包会携带以下两个信息:

发送方根据这两个信息就可以大概推测接收方的接收速度,从而逐步降低或增加发送速率。


TCP四次挥手

在数据传输完毕之后会进行TCP四次挥手即是TCP连接关闭,TCP需要进行四次挥手的原因在于TCP连接是全双工,即双方通信的,每个方向都必须单独进行关闭。


image.png

注:FIN – 结束标志。

  1. 客户端发送一个FIN,关闭客户端到服务端的数据传送,进入FIN-WAIT-1状态。
  1. 服务端收到这个FIN,返回一个确认ACK包(ack值为u+1),进入CLOSE-WAIT状态。
  1. 服务端也发送一个FIN给客户端,关闭与客户端的连接,进入LAST-ACK状态。
  1. 客户端发回ACK包确认,ack值为w+1,最后TCP连接关闭。

总结

本文参考了大量的文章,但是大多数文章都是讲解得不详细或者不够深入,也有一些好的文章做参考,再结合自己的理解来描述表达,让大家可以更清晰的理解详细过程。为了使本文内容更加准确无误,也做了大量的研究,若还有部分内容描述不正确,欢迎指正。下篇文章会主要讲解浏览器渲染过程。

<article style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; background: rgb(255, 255, 255); padding: 15px; color: rgb(64, 64, 64); font-family: Arial, "Helvetica Neue", Helvetica, sans-serif; font-size: 17px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 300; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">

参考文献

上一篇 下一篇

猜你喜欢

热点阅读