如题,今日调用 C 里面 INET 库时创建了一个 raw_tcp_socket,后来由于疏忽把组装的 TCP/UDP/ICMP 包都通过这个 socket 发了出去,却发现都能发送到目标上,十分不解,特此求教
1
johnlui May 25, 2017
socket 只是一个开发软件包,估计是这个软件包内部做了容错吧
|
2
KeepPro May 25, 2017 via Android
我记得网络协议是分了 7 层的吧。tcp 只是控制层?的协议,可能其他应用层的协议可以随意组合吧
|
3
catror May 25, 2017 via Android
raw socket 是 IP 层之上的
|
4
micxin2011 OP @KeepPro TCP UDP 都是一层里的我记得
|
5
micxin2011 OP @catror 主要是我传进去的协议参数是 IPROTO_TCP,其他的协议包一样能发送是什么道理
|
6
nbndco May 25, 2017
因为系统觉得没有必要浪费时间来检查你发送的包到底是不是符合你给定的协议的
|
7
zinan May 25, 2017
TCP 把其他协议的数据包封装在 tcp 报文里的, tcp 不会关心他封装的数据是什么, 你给它什么数据他就传什么数据, 他只负责把数据传送给对面的 tcp 对等实体
|
9
catror May 25, 2017 via Android
传进去的协议类型应该被异常处理忽略掉了吧,具体不知,可以把代码扒出来看一下嘛
|
10
JackyBao May 25, 2017 via Android
|
11
CRVV May 25, 2017
"把组装的 TCP/UDP/ICMP 包都通过这个 socket 发了出去,却发现都能发送到目标上"
怎么发现的? |
12
wwqgtxx May 26, 2017
用 wireshark 抓包看看不就知道他到底发了什么包了么
|
13
yangxin0 May 26, 2017 via iPhone
socket 是网络协议栈的接口,可以应用到任何一层,raw sockst 可以首发链路层协议所以当然可以发 IP 层协议,所以可以发 UDP。
|
14
micxin2011 OP @CRVV tcpdump
|
15
micxin2011 OP @nbndco 我自己组建了完整的 IP 头部加 TCP/UDP/ICMP 头部的包,他还会帮我再标记一个头部么
|
16
nbndco May 26, 2017 @micxin2011 开了 IP_HDRINCL ?那 IPPROTO_TCP 就被忽略了
|
17
micxin2011 OP @catror 简而言之就是把 netinet/下的头部(包括 TCP UDP ICMP 和可选的 ether)组装好,然后通过 socket(AF_INET, SOCK_RAW, IPROTO_TCP)发送出去
|
18
micxin2011 OP @nbndco 嗯是的,原来如此,谢谢
|
19
catror May 26, 2017 via Android
@micxin2011 😂我的意思是你找一下 socket 这个函数的代码看下,应该是创建 socket 的过程中处理了这种异常情况,因为协议类型一般传 0 也没啥问题
|