网络通信:不同主机,进程间通信,分为广域网和局域网
OSI 七层模型:是一种理论模型
应用层:通信传输的数据内容 http、FTP、TFTP、MQTT
表述层:数据加密,解密操作,压缩,解压缩
会话层:建立数据传输通道
传输层:数据传输方式 UDP TCP
网络层:实现数据路由 路由器
数据链路层:封装成帧,点对点通信(局域网内通信),差错检测 交换机
物理层:定义物理设备标准,比如网线,光纤等传输介质 (比特流 0 1)
TCP/IP 4层模型:工业生产所用的模型
应用层:HTTP, HTTPS(超文本传输协议) (基于TCP)
FTP : 文件传输协议(基于TCP)
TFTP:简单文件传输协议(基于UDP)
MQTT: 消息遥测传输协议(物联网)
DNS :域名解析服务
传输层:UDP : 用户数据报协议 面向数据包
TCP:传输控制协议 面向数据流
网络层:IPv4、IPv6
网络接口层:ARP:地址解析协议
TCP/IP 5层模型
应用程:
传输层:
网络层:
数据链路层:
物理层:
先了解一些概念:
标记主机:
MAC:硬件地址 : 局域网通信
IP:软件地址
端口号:同一主机,区分不同的网络进程,2字节的无符号整形数据,0-65535
ARP:地址解析协议,用于IP地址和MAC地址的转换
网络层:IP协议:IPv4:32bits;IPv6:128bits;点分十进制:如192.168.1.148
linux上查看ip地址:ifconfig;windows上查看ip地址:ipconfig
网络通信模型:
B/S : Browser----》Server;1. 通用的客户端
C/S : Client-----》Server;1. 专用的客户端;2. 客户端也可保存资源
UDP:用户数据报协议
特点:1. 无连接 ;2. 面向数据包;3. 不安全不可靠(尽最大努力交付),可能存在丢包和乱序的问题;4.可实现一对一, 一对多通信
UDP的缺点:
1. 无连接,有可能接收方未准备就绪
2. 发送速度和数据接收速度不匹配,导致缓冲区满,造成数据丢失
解决办法:
1. 控制数据发送速度。
2. 模仿tcp增加应答机制
应用场景:1. 允许数据丢失(视频画面传输,游戏,直播);2. 实时性高
下图是编程步骤:
int socket(int domain, int type, int protocol);
功能:创建一个通讯的套接字
参数:
domain: 网络协议族
AF_INET: IPv4
AF_INET6: IPv6
type: 表示传输层协议类型:SOCK_STREAM: tcp,OCK_DGRAM: udp
protocol:0 : 默认普通正常模式
返回值:成功:文件描述符;失败:-1
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
功能:向目标地址发送数据
参数:
sockfd:通讯套接字
buf:要发送的数据内容首地址
len : 内容字节数
flags : 0:默认方式发送
dest_addr:数据接收方的地址
addrlen:接收方的地址大小
返回值:成功:实际发送的字节数;失败:-1
struct sockaddr_in {
sa_family_t sin_family; /* address family: AF_INET */
in_port_t sin_port; /* port in network byte order */
struct in_addr sin_addr; /* internet address */
};
/* Internet address. */
struct in_addr {
uint32_t s_addr; /* address in network byte order */
};
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
功能:绑定套接字和自己的地址信息
参数:
sockfd:套接字
addr : 自己的地址信息
addrlen:地址的大小
返回值:成功:0;失败:-1
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
功能:接收udp发送的数据
参数:
sockfd:接收数据的套接字
buf:保存接收数据的首地址
len:期待收到的字节数
flags:0:默认方式接收
src_addr: 保存发送发地址信息的空间首地址
addrlen:发送方地址信息大小的首地址
返回值:成功:返回实际收到的字节数;失败:-1
这里注意:网络字节序是大端;主机字节序是小端,学习一些转换用的函数
htons: 将主机字节序(小端)的short类型转换成网络字节序(大端)
htonl: 将主机字节序(小端)的long类型转换成网络字节序(大端)
ntohs:将网络字节序转换成主机字节序
ntohl:inet_ntoa():将二进程整形ip转换成字符串ip
inet_addr() : 将字符串ip转换成网络字节序的二进制ip
TCP :传输控制协议
特点:
1. 有连接
2. 面向字节流(流式套接字)
3. 安全可靠的传输协议:.三次握手、四次挥手机制;应答机制....等一系列机制
4. 只能实现一对一通信
应用:要求数据安全可靠的场景下:HTTP、FTP、MQTT
三次握手:tcp为了确保通信双方都已准备就绪,在建立连接时,要进行三次握手操作。由客户端主动发起。
四次挥手:tcp为了确保断开连接时,通信双发都收发数据结束,在断开连接时,进行四次挥手,由任意一方发起。
TCP软件编程步骤:
int listen(int sockfd, int backlog);
功能:负责监听需要建立连接的客户端
参数:
sockfd:
backlog:允许同时监听的客户端的个数
返回值:成功:0;失败:-1
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:接收完成三次握手的客户端
参数:
sockfd:监听套接字
addr:建立连接的客户端地址
addrlen:客户端地址大小的指针
返回值:成功:通讯套接字;失败:-1
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
功能:接收数据
返回值:成功:实际收到字节数;失败:-1;对方断开连接:不再阻塞, 返回0
tcp粘包问题:tcp接收端接收到的数据多包发生了粘连。
为什么:
1. tcp协议面向的是字节流的协议,接收方不知到数据的大小,也不确定一次读取多少数据,从而造成粘包;
2. 接收缓冲区数据没有及时读走,导致多包数据在接收缓冲区一起被读走
如何解决:
1. 控制数据的发送速率。
2. 发送指定大小的数据
结构体
发 : sizeof(结构体);
收: sizeof(结构体);
但是存在结构体在不同平台字节对齐不一致,指针大小不同的问题。
3. 封装数据帧,应用层根据封装的数据帧进行解析
帧头 : 1个字节 0xAA 0x5A 0xA5 0x7E
数据长度:1个字节/2个字节 有效数据的字节数(不包含帧头和帧尾)
校验:8bits和校验:数据累加求和取低8bits
16bits和校验:数据累加求和取低16bits
CRC校验:
帧尾: 1个字节 0xBB 0x55 0xA5
TCP相关机制:
关于安全可靠的机制:
1. 三次握手和四次挥手,在前面已经说过了,可以翻过去看看
2. 应答机制 : tcp在发送数据时,会给数据的每个字节进行编号,每个数据包的第一个字节的编号 即为序列号,每个数据包的最后一个字节的编号加一即为确认序列号,客户端或服务端每发送 一次数据,就会发送一次序列号,然后对方会发送确认序列号应答。
3. 超时重传机制:如果在一定时间对方没有应答,就重新发送没有被应答的数据包
4. 流量控制机制:
tcp的流量控制主要通过以下两个机制实现:
滑动窗口:TCP使用滑动窗口来进行流量控制。接收方在TCP报文段的首部中通过"接收窗口"win字段告知自己的可接收数据量,即剩余的缓冲区大小。发送方根据接收方提供的窗口大小来决定发送数据的量,保证接收方能及时处理和接收数据。
发送方维护一个发送窗口,表示可以连续发送的数据量;
接收方维护一个接收窗口,表示还有多少空间可以接收数据;
发送方根据接收方提供的接收窗口大小来动态调整发送窗口的大小,以控制发送的数据量。
基于确认的流量控制:能确保发送方不会超出接收方的处理能力。接收方通过发送确认(ACK)报文来告知发送方已成功接收数据的字节数。发送方根据接收到的确认信息来调整发送数据的速率,避免发送过多的数据。
发送方发送数据后,等待接收方发送确认报文。
接收方收到数据后,发送确认报文,确认已成功接收数据。
发送方根据接收到的确认信息来调整发送窗口和发送速率,以控制数据的发送。
关于提高效率的机制:
1. 延迟应答:tcp的每一次应答并不是发送一次应答一次,而是可以延迟一段时间后应答,在此时间中可以进行接收数据的操作。
2. 滑动窗口机制:可以看前文
3. 捎带应答:应用层传输数据时,可以捎带把应答报文传输给对方
标志位:
1. URG: 紧急指针标志, 为1时表示紧急指针有效, 该报文应该优先传送。
2. ACK: 确认应答标志
3. PSH: 表示发送数据,提示接收端从TCP接收缓冲区中读走数据,为接收后续数据腾出空间
4. RST: 重置连接标志
5. SYN: 表示请求建立一个连接
6. FIN: finish标志, 表示释放连接
在了解http协议之前,先了解这几个概念
1. 万维网服务器如何标记数据资源 url:统一资源定位符:标记万维网文档
在此端口号可以省略
2. 万维网客户端和万维网服务器之间如何通信。 http
3. 万维网客户端如何展示数据: html
应用层:http协议:超文本传输协议;默认端口号:80 (备用端口8080),面向文本,http基于传输层的tcp实现(超文本:集文字,图像,音频,链接等于一体的文本)
通信过程:
1.建立tcp连接
2. 客户端给服务器发送http请求报文
3. 服务端发送http响应报文给客户端
4. 断开tcp连接
先在此了解一下请求报文和响应报文:
HTTP报文格式:
请求报文:请求行、消息报头、请求正文
响应报文:状态行、消息报头、响应正文
请求方式:
GET 请求获取Request-URI所标识的资源
POST 在Request-URI所标识的资源后附加新的数据
HEAD 请求获取由Request-URI所标识的资源的响应消息报头
PUT 请求服务器存储一个资源,并用Request-URI作为其标识
DELETE 请求服务器删除Request-URI所标识的资源
TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断
OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求
CONNECT 用于代理服务器
状态码:
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常