原始套接字与非原始套接字的区别

在python中,当我们使用socket.socket函数时,第二个参数通常可以选择SOCK_STREAM, SOCK_DGRAM和SOCK_RAW,前两者为非原始套接字,而后者是原始套接字。非原始套接字仅能决定传输层负载(即应用层报文段),由于是应用层端到端传输,除了ip地址还要提供一个端口号。而原始套接字拥有比前两者更高的权限,可以在网络层和链路层进行操作,即你可以自行决定ip header以及链路层header。(由socket.socket函数第一个参数的不同决定可以在哪一层操作。AF_INET允许网络层操作,AF_PACKET允许链路层操作,这里我们仅讨论网络层)由于层数更低,不需要端口号,仅需提供Ip地址,还有一个假端口号(随便多少都可以)。使用原始套接字接收到的数据为网络层数据报,而非原始套接字接收到的数据为应用层报文。具体内容可以使用wireshark来查看

还有一点就是,我猜测你能从socket中发出、接收哪些数据,跟socket.socket的第三个参数也有关,即协议名,不过懒得去证实了(总感觉这玩意儿越往深处学发现要学的东西越多。。。简直是个无底洞,最近还要忙别的课没时间钻牛角尖了)比如第三个参数选icmp,那你发送的数据就是从icmp数据头开头的,然后socket会自动给你加上ip数据头,你如果选别的协议作为参数,那么你自己写数据头的时候也是根据别的协议来写的,应该是这样

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容