我们现实网络无处不在,我们被庞大的虚拟网络包围,但我们却对它是怎样把我们的信息传递并实现通信的,我们并没有了解过,那么当我们在浏览器中出入一段地址,按下回车这背后都会发生什么? 比如说一般场景下,客户机和服务器不在一个局域网,输入的是一个域名而不是IP地址。那么当按下回车后,首先浏览器会通过DNS解析找到我们对应的IP地址,将http报文发送给目标IP地址对应的服务器,之后服务器做出响应,将请求的资源发送给浏览器。 TIP/IP在这当中扮演着重要的作用。
TCP/IP历史
在计算机发展的早期阶段,很多不同的厂商生产各种不同的计算型号,他们运行完全不同的操作系统,为了让他们之间能够相互通信,TCP/IP协议族诞生了。
那么为什么我们叫它协议族呢? 因为实际上TCP/IP是一组不同层次上的多个协议的组合。 那么协议组合是什么?——TCP/IP模型
TCP/IP模型
TCP/IP模型是一个四层结构,从上往下依次是应用层,运输层(传输层),网络层,网络接口层(数据链路层)。 通过开头我们输入一个url的例子,自上而下进行介绍TIP/IP参考模型
应用层
为用户提供各种服务,比如我们浏览网页时用到的HTTP,收发邮件时用的SMTP,登录远程主机用的SSH或者FTP协议,DNS等协议。 假设我们对 www.xxx.com
发送请求
- 浏览器看到这个域名的时候,就好像去一家从没去过的餐厅吃饭,只知道餐厅名字,却不知道具体地址,域名就像是一个餐厅的名字,而IP地址相当于一个具体的地址。 浏览器必须知道要请求服务器的IP地址,发出的请求才有目的地。DNS可以将IP转换成地址。
- http 会生成报文 ,这个请求里面包含了请求的方法,请求的路径“/”,请求的主机名,客户机的类型以及一些其他的信息。
传输层
传输层位于应用层下层,网络借口层的上层,主要有TCP和UDP两种协议。 UDP是用户数据报协议,不关心是否收到,不需要建立连接就可以通信,传输效率高,比如说微信。 而TCP是一种可靠的面向连接的协议,就是在交互数据前先建立一个TCP连接,如同打电话,首先要拨号,然后等待对方响应后才能彼此交流 TCP提供全双工服务,即数据可在同一时间双向传播 TCP将若干个字节构成一个分组,此分组称为报文段(Segment)
TCP连接的建立过程如下图所示。
- 三次握手
- 主机A通过一个标识为SYN标识位的数据段发送给主机B请求连接,告诉主机B“我想和你创建一条TCP连接”。
- 当主机B收到SYN请求后,如果其所请求的端口号正在等待连接,则会为这一条TCP连接分配资源,并主机A发送确认应答ACK和同步序列号SYNC标志位的数据段来响应主机。
- 主机A确认收到了主机B的数据段并可以开始传输实际数据。
- 四次挥手
- 主机A发送FIN控制位发出断开连接的请求 。
- 主机B进行响应,确认收到断开连接请求。
- 主机B发送FIN控制,随后关闭了连接。
- 主机A收到之后,又向主机B回复一个ACK应答。过了一段计时等待,主机A也关闭了连接,释放资源。这一段计时等待的时间是为了主机B重传最后的ACK防止其丢失。
网络层
在这一层中主要是 IP 协议处理数据传输。用于把数据从源主机经过若干个中间节点传送到目标主机,并向传输层提供最基础的数据传输服务。
在网络中,每台计算机都有一个唯一的地址,方便别人找到它,这个地址称为IP地址。 IP协议处理过的数据拥有自己的名字:IP数据报,让我们从下图来了解一下IP数据报的格式:
- 版本
- 一个4位二进制数的标识,用来标识IP协议的版本,目前大部分的协议版本号为4,因此IP有时也称为IPv4。
- 首部长部
- 优先级与服务类型
- 总长度
- 该字段用以指示整个IP数据包的长度,最长为65535字节,包括头和数据 标识符
- 唯一标识主机发送的每一份数据报
- 标志
- 分为3个字段,依次为保留位、不分片位和更多片位,保留位:一般被置为0 不分片位:表示该数据报是否被分片,如果被置为1,则不能对数据报进行分片,如果要对其进行分片处理,就应将其置为0 更多片位:除了最后一个分片,其他每个组成数据报的片都要将该位置设置为1.
- 段偏移量
- 该分片相对于原始数据报开始处位置的偏移量
- TTL(Time to Live生存时间)
- 该字段用于表示IP数据包的生命周期,可以防止一个数据包在网络中无限循环地发下去。TTL的意思是一个数据包在被丢弃之前在网络中的最大周转时间。该数据包经过的每一个路由器都会检查该字段中的值,当TTL的值为0时此数据包会被丢弃。TTL对应于一个数据包通过路由器的数目,一个数据包每经过一个路由器,TTL将减去1。
- 协议号
- 用以指示IP数据包中封装的是哪个协议
- 首部校验和
- 检验和是16位的错误检测字段。目的主机和网络中的每个网关都要重新计算报头的校验和,一样表示没有改动过。
- 源IP地址
- 该字段用于表示数据包的源地址,指的是发送该数据包的设备的网络地址
- 目标IP地址
- 该字段用于表示数据包的目标的地址,指的是接收节点的网络地址
数据链路层
在这一层中,上层传来的数据经过协议处理后的一份数据,我们称之为一帧(Frame) 在链路层中的地址指的的是计算机中网卡的硬件地址,即mac地址。我们知道,每一个网卡在出厂时,其内部都存有一个全世界独一无二的硬件标识,称为mac地址,它是的长度为6个字节。在网络中,两个计算机之间的通信实际上就是计算机中的两张网卡之间的通信。如果没有mac地址,就无法得知通信的具体位置,因此获取mac地址是计算机通信的基础保障。
但是实际上,计算机程序在发送连接请求时,一般只知道目的主机的IP地址,那么mac地址是如何获取的呢?这就要靠ARP协议来实现。
ARP协议(地址解析协议)可以看做是链路层的一个协议,它的作用是为IP地址与对应的mac地址之间提供动态的映射,这个过程是自动完成的,因此无需用户或管理员关心。ARP协议将IP映射为mac地址的过程大致如下:
如果目的主机与源主机位于同一网段,那么ARP协议会向本网段发送一个广播,网段中的所有主机都会受到一条消息,这条消息询问哪台主机的IP地址与目的主机地址相同。当目的主机接受到这条消息,就做出应答,将自己的mac地址发送过去。其他主机则将这条消息忽略。
如果目的主机与源主机位于不同网段,那么ARP协议会将消息发送给本地的路由,路由经过IP寻址找到目的主机所在网段的路由,再由目的路由将消息广播出去,获得目的主机响应后再返回给源主机。
一般来说, 每台机器都维护的有一个ARP缓存表, 存储了近期的IP地址和硬件地址的映射关系, 可以用 arp -a 命令来查看缓存表中内容。
总结
事实上当我们http访问一个地址的时候,从应用层开始向下传递,没经过一层,该层的协议会把上层传递的数据在这个基础上加一个首部,该首部包含了该层协议管理的信息,比如说网络层会打包IP信息,数据链路层打包mac地址。 通过这种层层打包的方式,最后由物理层传递出去,再有路由器,代理服务器等设备,交给目标计算机。 目标计算机得到传递过来的数据后,从物理层向上传递,每一层会将该层对应协议负责的首部摘除后再传给上层。最后抵达应用层对应的某个应用程序。