日期:2014-05-16  浏览次数:20764 次

链路层套接字 最大MTU和以太网CRC的问题
开发环境: 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 linux c语言

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

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

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

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