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

在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数据头,你如果选别的协议作为参数,那么你自己写数据头的时候也是根据别的协议来写的,应该是这样

你可能感兴趣的:(原始套接字与非原始套接字的区别)