connect、send、recv 等函数为什么只要IP和端口,而不要子网掩码
connect、send、recv 等函数为什么只要IP和端口,而不要子网掩码?我看了一下IP的结构,各字段也没有子网掩码成分。如果对方在子网中,那数据包如何找到对方电脑?
send函数需要一个缓冲区,从最上层的协议封装到最下层的过程中,似乎都看不见子网掩码在何时封装。难道不在send函数封装?是在其他函数(socket、bind、listen、accept...)封装吗?我看了一些网络方面理论的书,也没见到何时封装子网掩码
应该是在 链路层和物理层
子网掩码不需要我们操心。
比如校园网,大家的外部ip都是一样的,只是内部ip不一样,怎么区分内部ip,你需要看计算机网络技术这本书中的分址这一章
简单说下:
如果是外网,比如 A 和 B
send之后,数据会发到底层网卡,接着是路由器(保存了各个网络之间的路由路径),数据沿着这个路径走到B的路由器,经过网卡,最后被receive。
如果是内网,比如A里面有C、D
C,D连网时,会有一个ip(这个ip动态分配的),C发送数据到B,会经过A,A对数据包的源ip(就是C的内网ip)改为A的ip,接着如上外网一样发出去。收到时,再把目标ip改为C的ip,发到C的电脑上。
子网掩码在你的发送端是没用的,在中专端和接收端使用.比如你是192.168.1.1/24,子网掩码改成255.255.0.0,一样用.
这时如果你收到一个来自192.168.2.1的数据,网卡是会接受进来的,因为判断本法IP&掩码与对方IP&掩码是相同的,就判定你们是一个网段的了.如果掩码是255.255.255.0,你的网卡就会把这些数据丢掉不继续传到上层.