UDP传输时IP层的分片是怎么回事?

我们知道,当应用层程序之间进行网络数据传输时,在发送端,数据会从应用层沿着协议向下传输,通过tcp/ip层,然后经由链路层发送出去,而在接收端,则是相反的顺序,数据经由链路层接收,然后沿着协议栈向上传输,通过ip/tcp层,最后由应用层程序进行读取。

先来看程序, 服务端:

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys> #include <netinet> #include <arpa> #include <unistd.h>   int main() {     struct sockaddr_in srvAddr;     bzero(&amp;srvAddr,sizeof(srvAddr));     srvAddr.sin_family = AF_INET;     srvAddr.sin_addr.s_addr = htonl(INADDR_ANY);     srvAddr.sin_port = htons(8765);     int srvAddrLen = sizeof(srvAddr);       int iSock = socket(AF_INET, SOCK_DGRAM, 0);  // udp     bind(iSock, (struct sockaddr *)&amp;srvAddr, sizeof(srvAddr));       while(1)     { 		getchar(); 		char szBuf[50001] = {0};         recvfrom(iSock, szBuf, sizeof(szBuf) - 1, 0, (struct sockaddr *)&amp;srvAddr, (socklen_t*)&amp;srvAddrLen);         printf("msg from client [%s]n", szBuf);     }       close(iSock);     return 0; }</unistd.h></arpa></netinet></sys></string.h></stdlib.h></stdio.h>

 客户端:

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys> #include <netinet> #include <arpa> #include <unistd.h> #include <errno.h>   int main(int argc, char *argv[]) {     struct sockaddr_in srvAddr;     bzero(&amp;srvAddr, sizeof(srvAddr));     srvAddr.sin_family = AF_INET;     srvAddr.sin_addr.s_addr = inet_addr("10.100.70.140");     srvAddr.sin_port = htons(8765);       int iSock = socket(AF_INET, SOCK_DGRAM, 0); // udp 	#define N 2000 	char szBuf[N] = {0}; 	for(unsigned int i = 0; i <p>    我们在服务端抓包, 结果为:</p> <pre class="brush:JS;toolbar:false;">xxxxxx$ sudo tcpdump -iany src host 10.100.70.139 -Xnlps0 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on any, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes 00:13:57.187159 IP 10.100.70.139.46671 &gt; 10.100.70.140.ultraseek-http: UDP, length 2000         0x0000:  4500 05dc 0510 2000 4011 ae22 0a64 468b  E.......@..".dF.         0x0010:  0a64 468c b64f 223d 07d8 116e 6161 6161  .dF..O"=...naaaa         0x0020:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0030:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0040:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0050:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0060:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0070:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0080:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0090:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x00a0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x00b0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x00c0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x00d0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x00e0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x00f0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0100:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0110:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0120:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0130:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0140:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0150:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0160:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0170:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0180:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0190:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x01a0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x01b0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x01c0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x01d0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x01e0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x01f0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0200:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0210:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0220:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0230:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0240:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0250:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0260:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0270:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0280:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0290:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x02a0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x02b0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x02c0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x02d0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x02e0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x02f0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0300:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0310:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0320:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0330:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0340:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0350:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0360:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0370:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0380:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0390:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x03a0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x03b0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x03c0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x03d0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x03e0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x03f0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0400:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0410:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0420:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0430:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0440:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0450:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0460:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0470:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0480:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0490:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x04a0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x04b0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x04c0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x04d0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x04e0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x04f0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0500:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0510:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0520:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0530:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0540:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0550:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0560:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0570:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0580:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0590:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x05a0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x05b0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x05c0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x05d0:  6161 6161 6161 6161 6161 6161 0000 0000  aaaaaaaaaaaa....         0x05e0:  0000 0000 0000 0000 0000 0000            ............ 00:13:57.187161 IP 10.100.70.139 &gt; 10.100.70.140: ip-proto-17         0x0000:  4500 0224 0510 00b9 4011 d121 0a64 468b  E..$....@..!.dF.         0x0010:  0a64 468c 6161 6161 6161 6161 6161 6161  .dF.aaaaaaaaaaaa         0x0020:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0030:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0040:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0050:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0060:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0070:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0080:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0090:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x00a0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x00b0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x00c0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x00d0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x00e0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x00f0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0100:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0110:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0120:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0130:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0140:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0150:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0160:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0170:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0180:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0190:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x01a0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x01b0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x01c0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x01d0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x01e0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x01f0:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0200:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0210:  6161 6161 6161 6161 6161 6161 6161 6161  aaaaaaaaaaaaaaaa         0x0220:  6161 6161 0000 0000 0000 0000 0000 0000  aaaa............         0x0230:  0000 0000                                ....

 

  我们发现, 有两个IP包, 为什么会这样呢? 受到MTU的限制, IP包长度限制在1500字节, 我们看第一个包, 刚好就是1500字节, 第二个包刚好就是剩余的信息, 这就是IP分片(只针对UDP)的原因和原理。 而且要注意到, 第二个IP包是IP头+data, 并没有UDP头信息(更无端口信息可言), 所以, 如果抓包的时候, 采用端口过滤, 那么后面这个包肯定就丢了。 这个大坑, 好多人遇到过。

  相关推荐:

Nodejs实现的一个简单udp广播服务器、客户端_node.js

 

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享