网络数据包发送接收全过程

      你们都知道ISO七层协议从下往上依次为:服务器

物理层--》》数据链路层-》》网络层-》》传输层-》》会话层-》》表示层-》》应用层网络

各层之间是怎样工做的呢?为了加深理解,下面以一个具体的数据包来解释一下。数据结构

发送:socket

  1. 应用程序调用系统调用,将数据发送给socket。tcp

  2. socket检查数据类型,调用相应的send函数。函数

  3. send函数检查socket状态、协议类型,传给传输层。大数据

  4. tcp/udp(传输层协议)为这些数据建立数据结构,加入协议头部,好比端口号、检验和,传给下层(网络层)。google

  5. ip(网络层协议)添加ip头,好比ip地址、检验和,若是数据包大小超过了mtu(最大数据包大小),则分片;ip将这些数据包传给链路层链路层写到网卡队列,网卡调用响应中断驱动程序,发送到网络。spa


接收:orm

  1. 数据包从网络到达网卡,网卡接收帧,放入网卡buffer,在向系统发送中断请求。

  2. cpu调用相应中断函数,这些中断处理程序在网卡驱动中。

  3. 中断处理函数从网卡读入内存,交给链路层。

  4. 链路层将包放入本身的队列,置软中断标志位。

  5. 进程调度器看到了标志位,调度相应进程。

  6. 该进程将包从队列取出,与相应协议匹配,通常为ip协议,再将包传递给该协议接收函数。

  7. ip层对包进行错误检测,无错,路由结果,packet被转发或者继续向上层传递,若是发往本机,进入链路层
    链路层再进行错误侦测,查找相应端口关联socket,包被放入相应socket接收队列

  8. socket唤醒拥有该socket的进程,进程从系统调用read中返回,将数据拷贝到本身的buffer,返回用户态。


以上是一个客户端发起一个完整的数据包的所有流程,下面说明在底层的DNS转换和使用的一些主要协议:

DNS请求流程

  1. PC1要访问www.google.com,须要先知道对应IP地址。
    域名只起助记做用,互联网访问经过IP进行。
    比方,DNS是公民身份信息库,ip是身份证号,域名是该身份证号对应的人名。
    固然,这个比方不是很恰当,域名也必须惟一的,与ip对应。

  2. 因而,PC1须要像DNS请求,查找www.google.com对应的ip,即发送dns请求:
    PC1查找dns,发现不在同一个网络,不一样网段须要网关转发。
    可是,PC1须要先发送给网关,就须要先知道网关ip。
    网关用于链接不一样网络,而且有本身的IP,PC1须要知道网关ip。因而,经过ARP请求,像内网广播网关ip,网关回复mac地址。
    PC1获得了网关的mac地址,将ip包封装到以太网帧,发送给网关。

  3. 网关收到该以太网帧,须要转交给dns服务器。一样,网关可能须要发送ARP请求,获得dns的mac地址。

  4. dns服务器收到请求,将www.google.com的ip发送给网关,网关再根据NAT会话表项,将目的ip转换成PC1的,再发送给PC1(此过程可能一样须要ARP请求)。

  5. PC1收到了目的ip,再能够经过相似上面的方式发送请求(目的ip再能够直接填上获取的ip)。
    其中:
    ARP==>将ip广播,目的主机响应,反馈mac地址。

  6. NAT==>在一个网络内部,自定义合法的ip地址。内网各主机经过内网通信;与外网经过NAT转换,变成外网合法ip。这样,将内网与外网隔离,各个网络有本身的ip,既能够重叠,又能够经过少数几个ip与外网通信,在ip大量缺少的现代,节省了不少。

相关文章
相关标签/搜索