当前位置:  技术问答>linux和unix

链路层套接字 最大MTU和以太网CRC的问题

    来源: 互联网  发布时间:2017-04-28

    本文导语:  开发环境: Linux, C语言 我使用 socket (PF_PACKET,SOCK_RAW,htons(ETH_P_IP)) 链路层套接字写了两个程序, 一个是自己构造类似UDP的发送程序(构造以太网头、IP头、自己的UDP头)。 一个是接受程序,接受上面发送程序的数...

开发环境: Linux, C语言
我使用 socket (PF_PACKET,SOCK_RAW,htons(ETH_P_IP)) 链路层套接字写了两个程序,
一个是自己构造类似UDP的发送程序(构造以太网头、IP头、自己的UDP头)。
一个是接受程序,接受上面发送程序的数据。
分别在两台Linux机器上运行。

粗略看了 《UNIX网络编程》、《TCPIP协议卷一》, 有几个问题
1. 我在接受程序收到的数据,被内核自动加上了 4个字节的以太网CRC 校验和,假设发送的数据没有以太网CRC校验和或者校验和错误,在接受程序中 会内核判断错误就直接丢掉吗(即便我在链路层) ?
2. 接上一问,在发送程序 我可以通过一些设置,让内核不帮我加 以太网CRC校验和 吗?即发送没有以太网校验和的包。

3. 在发送程序, 我使用 sendto() 函数,当我增加发送数据长度时,不能超过1500(以太网最大MTU),否则报错。《TCPIP协议卷一》 里说以太网最大MTU是1500,MTU由硬件决定。我可以通过某种方式在不分包的情况下增加发送数据的长度吗?
4. 接上一问, 在接受程序 假设有一个以太网包MTU超过了1500, 接受程序能收到这包数据吗?会内核判断错误就直接丢掉吗?(即便我在链路层)

望大大答复, 或有这方面更详细的资料吗?

|
1.我以前也写个类型程序,CRC校验位是程序计算并写道包里面,没有发现系统会自动加上CRC校验位。

3.MTU是可以设置的,通过ioctl设置。

4.如果超过MTU,应该是丢包,或者截断,这个可以测试看看。

最详细和权威的资料就是你上面提的《UNIX网络编程》、《TCPIP协议卷一》

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 程序是先链路检测?
  • 网卡没有ipv6链路地址
  • socket问题,当客户端关闭或者实际链路断开后服务器端怎么判断?
  • 链路层数据帧问题
  • 请问:作为服务端,怎样知道对方(客户端)已关闭了链路?(前提是不用给对方发数据)
  • 请教哪里有在linux下用c/c++写的从数据链路层抓包的源代码下载?
  • 求助:协议族各属于5层TCP/IP模型中的哪个层?(这里物理层和数据链路层是分开的)
  • 数据包从应用程序发向链路层过程中什么时候指定netdevice
  • 在程序中如何判断一个socket链路在3分钟内没有收发任何信息?
  • 请问!在linux中可以用socket提取链路层的数据包(也就是非基于IP,UDP和TCP的数据包)吗?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3