网络数据包传送的过程
在整个数据报传输过程当中,
发送:
发送端进程首先调用系统调用,然后把数据发送给了socket,然后socket检查数据类型,调用系统调用send函数,send函数检查socket的状态,协议类型,传给了传输层,传输层对应的协议(UDP或者是TCP为这些数据创建数据结构),然后加入对应的传输层协议头部,然后交付给网际层,IP层,IP层加上它的头部,例如ip地址和检验和。然后决定是否分片,然后向下交付给数据链路层,数据链路层进行封装目的MAC和源MAC以及CRC校验。然后网卡调用中断驱动程序,发送到网络当中去。
接受:
数据报从网络中到达网卡,然后网卡接收到数据帧,放入网卡的缓存当中,向系统发送中断请求,执行中断处理程序,从网卡缓存当中读取到数据放入内存当中,然后把数据交给数据链路层,数据链路层进行解包,向上传递,IP层在对这个数据包进行差错检验等,此时如果是要接受的就向上层进行传递,如果不是,那么就丢弃或者转发,到达传输层,进行对应协议交付解包,然后向上到达应用层,交付给对应的协议,放入socket接受队列当中,然后接收的进程进行系统调用,获得数据,拷贝至进程缓冲区。然后返回用户态。
DNS请求过程
- 我们从一台主机去访问 www.baidu.com,需要首先知道IP地址,这样我们就需要通过域名解析,PC1首先发出DNS请求,查找www.baidu.com对应的ip。(域名和唯一的ip地址对应这)
- 如果此时发现不在同一个网络,就需要通过路由设备转发,这个时候首先通过ARP请求,得到路由器的ip,然后把DNS请求封装成以太网帧发送给路由器。
- 路由器收到以太网帧,然后转发给DNS服务器,这个过程当中路由器可能需要发送ARP请求,得到DNS服务器的MAC地址。
- 当DNS收到DNS请求,然后这个时候就会把 www.baidu.com 的ip地址发送给路由器,然后路由器再进行转发给PC1
- PC1最终收到目的ip地址。