当前位置: 技术问答>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, 接受程序能收到这包数据吗?会内核判断错误就直接丢掉吗?(即便我在链路层)
望大大答复, 或有这方面更详细的资料吗?
我使用 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协议卷一》
3.MTU是可以设置的,通过ioctl设置。
4.如果超过MTU,应该是丢包,或者截断,这个可以测试看看。
最详细和权威的资料就是你上面提的《UNIX网络编程》、《TCPIP协议卷一》
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。