为什么有时需要对IP数据报进行分片?如何分片?

发布网友

我来回答

2个回答

懂视网

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

先来看程序, 服务端:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
 
int main()
{
 struct sockaddr_in srvAddr;
 bzero(&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 *)&srvAddr, sizeof(srvAddr));
 
 while(1)
 {
		getchar();
		char szBuf[50001] = {0};
 recvfrom(iSock, szBuf, sizeof(szBuf) - 1, 0, (struct sockaddr *)&srvAddr, (socklen_t*)&srvAddrLen);
 printf("msg from client [%s]
", szBuf);
 }
 
 close(iSock);
 return 0;
}

客户端:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <errno.h>
 
int main(int argc, char *argv[])
{
 struct sockaddr_in srvAddr;
 bzero(&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 < N; i++) //字符数组最后一个字符不要求是‘