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

shaying526 2013-10-17 11:20:00
开发环境: 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, 接受程序能收到这包数据吗?会内核判断错误就直接丢掉吗?(即便我在链路层)

望大大答复, 或有这方面更详细的资料吗?
...全文
483 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
UDP协议和IP协议分别需要有校验位。 建议用ioctl改MTU值试试。
shaying526 2013-10-20
  • 打赏
  • 举报
回复
引用 4 楼 songsong33 的回复:
CRC校验位 在哪个位置 《TCPIP协议卷一》里面有描述,具体哪里忘记了
我收到的数据是包括 以太网的CRC校验位的, IP数据报之后, 即收到的数据的最后4个字节 另外我 使用命令设置了 MTU # sudo ifconfig eth0 mtu 4000 两边都设置但是好像数据长度超过1500还是收不到了。 发送1500以下的才可以收到。 直接用网线连接,中间没有经过路由器。 还没弄清楚在研究。
  • 打赏
  • 举报
回复
CRC校验位 在哪个位置 《TCPIP协议卷一》里面有描述,具体哪里忘记了
shaying526 2013-10-17
  • 打赏
  • 举报
回复
引用 1 楼 songsong33 的回复:
1.我以前也写个类型程序,CRC校验位是程序计算并写道包里面,没有发现系统会自动加上CRC校验位。 3.MTU是可以设置的,通过ioctl设置。 4.如果超过MTU,应该是丢包,或者截断,这个可以测试看看。 最详细和权威的资料就是你上面提的《UNIX网络编程》、《TCPIP协议卷一》
感谢回复, 你说的, CRC校验位 是以太网的 添加在帧尾的,是吗?而不是IP数据报的校验。 IP包头的校验 程序中有体现, 但以太网我确实没添加, 我在测试看看。
  • 打赏
  • 举报
回复
2.CRC检验是一定要的,这是TCP/IP协议的规定
  • 打赏
  • 举报
回复
1.我以前也写个类型程序,CRC校验位是程序计算并写道包里面,没有发现系统会自动加上CRC校验位。 3.MTU是可以设置的,通过ioctl设置。 4.如果超过MTU,应该是丢包,或者截断,这个可以测试看看。 最详细和权威的资料就是你上面提的《UNIX网络编程》、《TCPIP协议卷一》

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧