写点什么

网络请求是如何发送出去的

用户头像
kof11321
关注
发布于: 2021 年 01 月 11 日

当我们在编程的时候,通过网络发送数据,以 UDP 发送为例

char *hello = "Hello from client"; sendto(sockfd, (const char *)hello, strlen(hello),         MSG_CONFIRM, (const struct sockaddr *) &servaddr,              sizeof(servaddr));
复制代码

其中指定的地址,为目标服务器地址(IP),那么网络请求是如何发送出去的。

网络请求包的 N 层结构

  1. MAC 头

源 MAC:本机的 MAC

目标 MAC:你的机器如何知道目标 IP 的 MAC 地址???

  1. IP 头

源 IP:本机 IP

目标 IP:编程时写入的 IP 地址或者域名

  1. UDP/TCP 头

源端口:本机可能随即指定的一个端口

目标端口:编程时指定的端口号,例如 http 默认是 80,https 默认是 443

  1. 上层协议头

例如 HTTP 的协议头等信息,由应用程序的框架来组装该协议头,例如 java 的 HttpClient 发送 http 请求。。。

问题 1:目标 MAC 地址应该是什么

网络请求发送,四层协议头缺一不可,但是在 MAC 层我们没有这个目标地址的 MAC 地址,请求包如何发送出去?

Case 1:目标 IP 在同一网段

目标 IP 地址与本机 IP 地址,在同一个网段,通过 ARP 广播,得到对应的目标 IP 的 MAC 地址

Case 2:目标 IP 不在同一网段

目标地址 IP 与本机 IP 不在一个网段里,请求只能通过网关出去,所以此时目标的 MAC 地址,是网关 MAC。隐藏的约束:网关的 MAC,本机 IP 如何获得。所以网关必须和本机在同一个网段里,才能通过 ARP 协议,拿到网关的 MAC,从而将包发送到网关上。

问题 2:其他网络主机会不会处理不是他 MAC 地址的包

携带了完整信息的网络请求包,源 MAC,目标 MAC,源 IP,目标 IP。。。,发送到网络以后,

  1. 所有的本网段的机器都会收到这个包,只是其他的机器不处理该包,因为 mac 地址不对?

  2. 还是只有对应的目标机器能收到该包?

参考https://blog.csdn.net/yang_hugo/article/details/42407905

  1. 正常情况下,网卡收到网络包后,比较 MAC 地址,是否与本机 MAC 匹配。如果不匹配,丢弃。匹配,传到上层

  2. 如果网卡配置为混听模式,所有包都传给上层


发布于: 2021 年 01 月 11 日阅读数: 21
用户头像

kof11321

关注

还未添加个人签名 2018.08.14 加入

还未添加个人简介

评论

发布
暂无评论
网络请求是如何发送出去的