主要用来定义物理设备标准,物理层关注在一条通道上传输原始的0和1的电信号,常见的传输介质有:有线(光纤)、无线(无线电)、卫星
用来规定0和1的分组规则,以太网协议规定,一组电信号构成一个数据包,叫做"帧"(Frame).每一帧分成两个部分:Head和Data,其中head中包含源mac地址、目标mac地址
源mac地址如何知道目标mac地址?
使用ARP协议通过发送广播用目标Ip得到目标mac
主要用来为不同主机提供网络通讯服务,主要使用ip协议
网络层的特点:
网络层在发送分组时不需要先建立连接。每一个IP数据报独立发送,与其前后的分组无关(没有编号)。
网络层不提供服务质量的承诺。所传送的分组可能出错、丢失、重复和失序。如果主机中的进程之间的通信需要时可靠的,那么就要由传输层负责。
ip协议规定了ip协议的报文格式、ip地址的规则等。ip地址规则如下
这里就出现了一个很尴尬的事情,就是c类地址的主机数太少,而b类地址的主机数又太多,于是出现了无类型域间选路(CIDR),这种方式打破了原来设计的几类地址的做法,将 32 位的 IP地址分为网络号、主机号。如下图,就是说32位中,前24位是网络号,后8位是主机号
为了能够指明一个IP地址所标示的主机处于哪个子网中,所以有了子网掩码,子网掩码的规则:子网掩码是32位二进制数,其对应网络地址的位都是1,对应主机位置的都是0。因此就上面这个截图来说,它的子网掩码应该是255.255.255.0,截图如下
再来说一说网关(gateway),当访问不在同一个局域网的机器时就会经过网关(如何确定目标地址与自己是否在同一个网段,就可以通过子网掩码计算)。网关的地址一定是和源 IP 地址是一个网段的,往往不是第一个,就是第二个。例如 10.58.10.188/24,往往会是 10.58.10.1/24 或者 10.58.10.2/24
主要用来为两个主机之间的进程提供通讯服务。主要协议有tcp协议、udp协议。由于udp协议接触的比较少,这里只说tcp协议.
完整的tcp头的格式如下
这里挑重点介绍一下这些都是什么意思
源端口、目标端口:既客户端哪个端口要与服务端的哪个端口进行通讯。由于传输层主要是两个主机进程间的通讯,所以必须要有端口号
序号(seq):用于保证顺序的。所以可以知道tcp是有序的
确认序号(ack):对于tcp来说,发出去的包就应该有收到确认,如果没有收到则重新发送,这可以在tcp层保证不丢包,但如果网络不好,tcp只能不断重试来努力保证可靠
状态位:例如 SYN 是发起一个连接,ACK 是回复,RST 是重新连接,FIN 是结束连接等。TCP 是面向连接的,因而双方要维护连接的状态,这些带状态位的包的发送,会引起双方的状态变更
窗口大小:通信双方各声明一个窗口,标识自己当前能够的处理能力,让对方一起不要发太多数据
如下图:
从tcp协议发送的数据我们能够看出他的一些特点:保证顺序、保证不丢包、能够维护连接、能够控制流量
这里说一下常常说到的三次握手、四次挥手
三次握手主要流程如下:
为什么是三次?这是出于效率考虑,只要双方都收到了对方的消息并给出应答,就可以认为已经能够成功建立连接。一次tcp连接的建立过程如下:
由于三次握手的资源消耗较大,因此,当建立连接后会保持连接状态,进行多次通信。http 1.1中默认开启保持连接
四次挥手主要流程如下:
四次挥手就是为了确认双方的信息都已经发送完毕所需要的最小次数.一次四次挥手的过程如下:
使用socket编程来进行通讯就是基于tcp协议/udp协议的。
用来直接为用户的进程提供服务,常见的协议有http、smtp等。这里以http协议分析一下,http请求的报文格式如下:
抓包可以看到请求行的内容如下,
方法主要有get、post、put、delete四种,都比较常见而且简单,不做赘述
cache-control:Cache-control是用来控制缓存的。当客户端发送的请求中包含 max-age 指令时,如果判定缓存层中,资源的缓存时间数值比指定时间的数值小,那么客户端可以接受缓存的资源;
当指定 max-age 值为 0,那么缓存层通常需要将请求转发给应用集群。通常情况下max-age都是0
if-modified-since:也是一个关于缓存的。如果服务器的资源在某个时间之后更新了,那么客户端就应该下载最新的资源;如果没有更新,服务端会返回“304 Not Modified”的响应,那客户端就不用下载了,可以节省带宽。
还需要留意的:
connection:keep-alive : 这个参数在http1.1之中是默认开启的,表示当建立tcp连接之后可以多次请求复用
以网络分层来看一个请求的流程如下:
这里我们回顾一下整个http请求的流程
当我们在浏览器打开一个标签页时浏览器会随机开启一个端口,当访问一个地址时,浏览器会帮我们拼装好对应的Http报文,然后会去dns服务器解析域名对应的ip地址,这时浏览器会把它交给下一层传输层.
ps.相信有人遇到过电脑不能打开网页,但是QQ能上网的情况,这种情况其实就是应为dns不对,导致无法解析到域名的地址导致的;而qq则是使用udp/tcp协议,不受dns的影响.
那浏览器是怎么把数据交给传输层的呢?实际上是浏览器起了一个socket进行通讯。 协议是基于 tcp 协议的,所以它使用面向连接的方式发送请求,通过 Stream 二进制流的方式传给对方。到了 TCP 层,它会把二进制流变成一个的报文段发送给服务器。在上面的过程中我们可以拿到源端口、目标端口,这样在传输层就知道把信息发给谁,收到的信息由谁来接收。
在 IP 层,都需要加上自己的源地址和目标地址,客户端需要查看目标地址和自己是否是在同一个局域网。一般情况下目标 IP 和源 IP 不会在同一个网段,因而需要发送到默认的网关。一般通过 DHCP 分配 IP 地址的时候,同时配置默认网关的 IP 地址。但是客户端不会直接使用默认网关的 IP 地址,而是发送 ARP 协议来获取网关的 MAC 地址,然后将网关 MAC 作为目标 MAC,自己的 MAC 作为源 MAC,放入 MAC 头,发送出去。发送出去服务器开始接收的时候无非是把整个流程反过来走一次