一、粘包问题
原因:tcp流式套接字,数据与数据之间没有边界感,导致可能多次的数据粘到一起
解决办法:
(1)、规定间隔符,如:“ \r\n”等;
(2)、指定发送数据的长度
(3)、利用struct进行数据打包。
二、recv:用于从套接字接收数据
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
sockfd
:是套接字描述符,指定了要接收数据的套接字。buf
:是一个指向缓冲区的指针,该缓冲区用于存储接收到的数据。len
:指定了缓冲区的长度,即可以接收的最大字节数。flags
:指定了接收操作的行为,大多数情况下设置为0。
三 、IP数据报的格式
(1)、版本,占4位,即ip协议的版本
(2)首部长度 占4位,可表示的最大十进制数值是15。请注意,这个字段所表示数的单位是32位字(1个32位字长是4字节),因此,当P的首部长度为1111时(即十进制的15),首部长度就达到最大值60字节。
(3)区分服务,占8位
(4)(4)总长度 总长度指首部和数据之和的长度,单位为字节。
总长度字段为16位,因此数据报的最大长度为216 -1 = 65535字节。
(5)标识
(6)标志(flag) 占3位,但目前只有两位有意义。
标志字段中的最低位记为 MF (More Fragment)。MF = 1即表示后面“还有分片”的数据报。MF=0表示这已是若干数据报片中的最后一个。
标志字段中间的一位记为DF (Don't Fragment),意思是“不能分片”。只有当DF=0时才允许分片。
(7)片偏移 占13位。片偏移指出:较长的分组在分片后,某片在原分组中的相对位置。也就是说,相对于用户数据字段的起点,该片从何处开始。片偏移以8个字节为偏移单位。这就是说,每个分片的长度一定是8字节(64位)的整数倍。
(8)生存时间 占8位
(9)协议 占8位
(10)首部检验和 占16位
(11)源地址 占32位
(12)目的地址 占32位
四、抓包工具------tcpdump
tcp.port == 端口号 && tcp.ip == IP地址
可视化界面:wireshark
过滤规则:
1.根据ip地址:
(1)ip.src == ip地址 (2)ip.dst ==ip地址
2.根据端口:
(1)tcp.srcport == 端口号 (2)tcp.dstport == 端口号
(3)udp.srcport == 端口号 (4)udp.dstport == 端口号
3.根据协议类型:tcp,udp,icmp……
4.任意组合以上条件抓包
如果与:and; ip.src == ip地址 and tcp.dstport == ip地址
如果或:or ; ip.src == ip地址 or tcp.dst == ip地址