一、UDP 网络协议的补充内容
1、特点
1)面向数据包
2)无需建立连接
3)尽最大努力交付,不安全、不可靠(数据丢包、乱序)
4)可实现一对一、一对多的传输
5)机制简单,资源开销小,数据实时性高(VNC、直播)
2、如何避免 UDP 丢包
1)发送方以较慢的速度发送数据,让接收方又足够的时间处理数据。
2)模仿TCP的机制:应答机制
3、UDP 报文头部

UDP头部:总共8字节
源端口号:发送方网络进程端口号
目标端口号:接收方网络进程端口号
长度:UDP发送的报文的整体长度(UDP头部+UDP正文)
校验和:数据差错校验
二、抓包工具 wireshark
网络抓包:抓取通过设备网卡的网络数据,从而调试和分析网络程序。
抓包流程:
1、sudo wireshark启动抓包工具
2. 选取要抓取的网卡--->any
3. 选择一个过滤条件
4. 开始抓取
5. 进行一次网络通信
三、TCP 网络协议
TCP : 位于传输层,全称为传输控制协议(流式套接字)。
1、TCP 的特点
1) 面向数据流
2)有连接(通信之前必须建立连接)
3)安全可靠的传输机制
4)机制复杂,网络资源开销大
5)本质只能实现一对一的通信(使用TCP并发方式可实现一对多通信)
2、TCP 三次握手四次挥手机制
1)TCP三次握手
TCP建立连接时,需要进行三次握手,为了确保收发双方通信之前都已准备就绪。

* SYN : 请求建立连接标志位
* ACK :响应报文标志位
2)TCP四次挥手
TCP断开连接时,需要进行四次挥手,确保断开连接前双方都已通信结束。)

* FIN : 请求断开连接标志位
3、TCP 的编程流程

* 监听套接字:监听客户端是否完成三次握手。
4、函数接口
1)connect() 函数
| int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); |
| 功能:请求与服务端建立连接 参数: sockfd:套接字 addr:要连接的服务端的地址信息 addrlen:服务端地址大小 返回值: 成功:0 失败:-1 |
2)send() 函数
| ssize_t send(int sockfd, const void *buf, size_t len, int flags); |
| 功能:发送网络数据 参数: sockfd:网络套接字 buf:要发送的数据首地址 len:发送的字节数 flags:0 :按照默认方式发送 返回值: 成功:实际发送的字节数 失败:-1 |
3)listen() 函数
| int listen(int sockfd, int backlog); |
| 功能:监听建立三次握手的客户端 参数: sockfd:监听套接字 backlog:最大允许监听的客户端个数 返回值: 成功:0 失败:-1 |
4)accept() 函数
| int accept(int socket, struct sockaddr *restrict address, socklen_t *restrict address_len); |
| 功能:接收建立三次握手的客户端,并产生一个通讯套接字 参数: socket:监听套接字 address:客户端的地址信息 address_len:客户端地址长的指针 返回值: 成功:通讯套接字 失败:-1 |
5)recv() 函数
| ssize_t recv(int sockfd, void *buf, size_t len, int flags); |
| 功能:从网络套接字上接收数据 参数: sockfd:通讯套接字 buf:存放接收数据的首地址 len:期望接收到的字节数 flag : 0:默认方式接收(阻塞) 返回值: 成功:实际接收到的字节数 失败:-1 对方断开连接:0 |
5、TCP 粘包问题
1)概念
TCP粘包问题:发送方应用层发送的多包数据,将来在接收方可能一次读到,多包数据产生了粘连。
2)原因
(1)发送方速度较快,TCP底层可能对多包数据进行重新组帧;
(2)接收方数据处理速度较慢,导致多包数据在接收缓冲区缓存,应用层读时,一次将多包数据读出。
3)解决粘包问题的常用方法
(1)调整发送速率
(2)发送指定大小,将来接收方也接受指定大小。
结构体
* 注意: 跨平台之间的数据传输时,注意结构体对齐问题。
32bits平台<--->64位平台
(3)应用层位发送的数据增加分隔符,利用分隔符解析
hello world\nhow are you\n
(4)封装自定义数据帧格式进行发送(协议),严格根据协议进行解析。
AA C0 00 00 00 F0 00 BB 10 A0 00 00 00 10 校验 BB AA C0 00 00 00 F0 00 BB 10 A0 00 00 00 10 校验 BB AA C0 00 00 00 F0 00 BB 10 A0 00 00 00 10 校验 BB
帧头:AA
帧尾:BB
有效数据长度:C0
有效数据:00 00 00 F0 00 BB 10 A0 00 00 00 10
校验:
8位和校验
16位和校验
CRC校验
6、TCP 协议应用示例
使用结构体解决 TCP 粘包问题
1)需包含头文件 head.h
#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <arpa/inet.h>
#include <pthread.h>
#endif
2)客户端代码
#include "head.h"
int main(void)
{
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0)
{
perror("socket error");
return -1;
}
struct sockaddr_in seraddr;
seraddr.sin_family = AF_INET;
seraddr.sin_port = htons(50000);
seraddr.sin_addr.s_addr = inet_addr("192.168.0.161");
int ret = connect(sockfd, (struct sockaddr *)&seraddr, sizeof(seraddr));
if(ret < 0)
{
perror("connect error");
return -1;
}
char buff[1024] = {0};
while(1)
{
memset(buff, 0, sizeof(buff));
fgets(buff, sizeof(buff), stdin);
ssize_t cnt = send(sockfd, buff, strlen(buff), 0);
if(cnt < 0)
{
perror("send error");
return -1;
}
printf("cnt = %ld\n", cnt);
}
close(sockfd);
return 0;
}
3)服务端代码
#include "head.h"
struct mgc
{
char text;
};
int main(void)
{
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0)
{
perror("socket error");
return 0;
}
struct sockaddr_in seraddr;
seraddr.sin_family = AF_INET;
seraddr.sin_port = htons(50000);
seraddr.sin_addr.s_addr = inet_addr("192.168.0.161");
int ret = bind(sockfd, (struct sockaddr *)&seraddr, sizeof(seraddr));
if(ret < 0)
{
perror("bind error");
return -1;
}
ret = listen(sockfd, 10);
if(ret < 0)
{
perror("listen error");
return -1;
}
int connfd = accept(sockfd, NULL, NULL);
if(connfd < 0)
{
perror("accept error");
return -1;
}
char buff[1024] = {0};
struct mgc mymgc;
ssize_t cnt = recv(connfd, &mymgc, sizeof(struct mgc), 0);
if(cnt < 0)
{
perror("recv error");
return -1;
}
printf("cnt = %ld, buff = %s\n", cnt, buff);
close(connfd);
close(sockfd);
return 0;
}
【END】
&spm=1001.2101.3001.5002&articleId=150742713&d=1&t=3&u=1ffdf2409abd416fa83bf1ce9416d701)
2万+

被折叠的 条评论
为什么被折叠?



