熟悉IP/TCP包结构的同学一定知道, 在TCP包中, 是没有字段标注整个TCP包长度的, 为什么呢? 因为完全可以根据IP包的信息来计算出TCP包的长度。 但是, 在IP/UDP中, UDP包头居然给出了整个UDP包的长度, 这个信息不是冗余的吗?
看过《TCP/IP详解》这套书的同学肯定知道, UDP包长信息, 确实是冗余的。 来看看:
#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("127.0.0.1");
srvAddr.sin_port = htons(8765);
int iSock = socket(AF_INET, SOCK_DGRAM, 0); // udp
#define N 1024
char szBuf[N] = {0};
for(unsigned int i = 0; i < N; i++) //字符数组最后一个字符不要求是‘\0’
{
szBuf[i] = 'a';
}
int iRet = sendto(iSock, szBuf, sizeof(szBuf), 0, (struct sockaddr *)&srvAddr, sizeof(srvAddr));
printf("send size is %d, iRet is %d, errmsg[%s]\n", sizeof(szBuf), iRet, strerror(errno));
close(iSock);
return 0;
}
运行并抓包:
xxxxxx$ sudo tcpdump -iany port 8765 -Xnlps0
tcpdump: verbose output s