安庆公司做网站,做微信公众号页面的网站,网站开发遵循的标准或规范,小程序和h5的区别和优势1.TCP和UDP区别
都为传输层协议 UDP#xff1a;用户数据报协议#xff0c;面向无连接#xff0c;可以单播#xff0c;多播#xff0c;广播#xff0c;面向数据报#xff0c;不可靠 TCP#xff1a;传输控制协议#xff0c;面向连接的#xff0c;可靠的#xff0c;基…1.TCP和UDP区别
都为传输层协议 UDP用户数据报协议面向无连接可以单播多播广播面向数据报不可靠 TCP传输控制协议面向连接的可靠的基于字节流仅支持单播传输
UDPTCP是否创建连接无连接面向连接是否可靠不可靠可靠的连接的对象个数一对一、一对多、多对一、多对多一对一传输的方式面向数据报面向字节流首部开销8个字节最少20个字节适用场景实时应用视频会议直播可靠性高的应用
2.TCP通信流程
(1) 服务器端 1.创建一个用于监听的套接字 -监听监听有客户端的连接 -套接字就是一个文件描述符 2将这个监听文件描述符和本地的IP和端口绑定IP和端口就是服务器的地址信息) -客户端连接服务器的时候使用的就是这个IP和端口 3设置监听监听的fd开始工作 4阻塞等待当有客户端发起连接解除阻塞接受客户端的连接会得到一个和客户端通信的套接字(fd) 5通信 -接收数据 -发送数据 6通信结束断开连接
(2) 客户端 1创建一个用于通信的套接字fd) 2连接服务器需要指定连接的服务器的IP和端口3连接成功了客户端可以直接和服务器通信 -接收数据 -发送数据 4通信结束,断开连接
3.通信时所需要用到的函数API
int socket(int domainint typeint protoco1);-功能:创建一个套接字-参数:- domain : 协议族AF_INET : ipv4 AF_INET6 : ipv6AF__UNIXAF_LOCAL :本地套接字通信进程间通信- type : 通信过程中使用的协议类型SOCK_STREAM ︰流式协议SOCK_DGRAM︰报式协议-protoco1 : 具体的一个协议。一般写0- SOCK_STREAM︰流式协议默认使用 TCP- SOCK_DGRAM︰报式协议默认使用UDP-返回值:-成功:返回文件描述符操作的就是内核缓冲区。-失败:-1int bind(int sockfdconst struct sockaddr *addrsocklen_t addr len);-功能:绑定将fd 和本地的IP 端口进行绑定-参数:- sockfd :通过socketi函数得到的文件描述符- addr :需要绑定的socket地址这个地址封装了ip和端口号的信息- addrlen :第二个参数结构体占的内存大小int listen(int sockfdint backlog); // /proc/sys/net/core/somaxconn-功能:监听这个socket上的连接-参数:- sockfd :通过socket()函数得到的文件描述符- backlog :未连接的和已经连接的和的最大值5int accept(int sockfdstruct sockaddr *addr ,socklen_t *addrlen);-功能:接收客户端连接默认是一个阻塞的函数阻塞等待客户端连接-参数:- sockfd :用于监听的文件描述符- addr :传出参数记录了连接成功后客户端的地址信息ip, port)- addrlen :指定第二个参数的对应的内存大小-返回值:-成功:用于通信的文件描述符- -1 :失败
int connect(int sockfdconst struct sockaddr *addr socklen_t addrlen) ;-功能:客户端连接服务器-参数:- sockfd :用于通信的文件描述符- addr :客户端要连接的服务器的地址信息- addrlen :第二个参数的内存大小-返回值: 成功0失败-1
ssize_t write(int fdconst void *bufsize_t count);//写数据
ssize_t read(int fdvoid *buf size_t count);//读数据4.TCP三次握手
目的保证双方互相之间建立了连接 什么时候三次握手发生在客户端连接时 为甚莫要三次握手确认双方都能发送和接收数据 三次握手在TCP协议头中1.将SYN的值置为1。2.服务端将ACK置为1并且将SYN置为1 。3.客户端将ACK置为1 序号确认号确保TCP协议的传输时的完整性和顺序性
第一次握手:1.客户端将SYN标志位置为12.生成一个随机的32位的序号seqJ 这个序号后边是可以携带数据数据的大小)
第二次握手:1.服务器端接收客户端的连接:ACK12.服务器会回发一个确认序号:ack客户端的序号数据长度SYN/FIN(按一个字节算)3.服务器端会向客户端发起连接请求:SYN14.服务器会生成一个随机序号:seq K
第三次握手:1.客户单应答服务器的连接请求:ACK12.客户端回复收到了服务器端的数据:ack服务端的序号数据长度SYN/FIN(按一个字节算)5.三次握手、滑动窗口、四次挥手
# mss: Maximum Segment Size(一条数据的最大的数据量)
# win: 滑动窗口
1. 客户端向服务器发起连接客户单的滑动窗口是4096一次发送的最大数据量是1460
2. 服务器接收连接情况告诉客户端服务器的窗口大小是6144一次发送的最大数据量是1024
3. 第三次握手
4. 4-9 客户端连续给服务器发送了6k的数据每次发送1k
5. 第10次服务器告诉客户端发送的6k数据以及接收到存储在缓冲区中缓冲区数据已经处理了2k,窗口大小是2k
6. 第11次服务器告诉客户端发送的6k数据以及接收到存储在缓冲区中缓冲区数据已经处理了4k,窗口大小是4k
7. 第12次客户端给服务器发送了1k的数据8. 第13次客户端主动请求和服务器断开连接并且给服务器发送了1k的数据
9. 第14次服务器回复ACK 8194, a:同意断开连接的请求 b:告诉客户端已经接受到方才发的2k的数据c:滑动窗口2k
10.第15、16次通知客户端滑动窗口的大小
11.第17次第三次挥手服务器端给客户端发送FIN,请求断开连接
12.第18次第四次回收客户端同意了服务器端的断开请求6.TCP三次握手、四次挥手的状态转换
ClientServerSYN_SENT(connect())LISTEN(listen())SYN_RECVDESTABLISHEDESTABLISHED
ClientServerFIN_WAIT_1 (close())CLOSE_WAITLAST_ACK(close())FIN_WAIT_2TIME_WAIT
主动断开连接的一方, 最后进入一个 TIME_WAIT状态, 这个状态会持续: 2msl 半关闭状态
7.端口复用
在最后的关闭时出现TIME_WAIT状态在此调用时会出现端口占用的错误。所用要用端口复用
端口复用最常用的用途是: 防止服务器重启时之前绑定的端口还未释放 程序突然退出而系统没有释放端口
#include sys/types.h
#include sys/socket.h
// 设置套接字的属性不仅仅能设置端口复用
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_toptlen);
参数- sockfd : 要操作的文件描述符- level : 级别 - SOL_SOCKET (端口复用的级别)- optname : 选项的名称- SO_REUSEADDR- SO_REUSEPORT- optval : 端口复用的值整形- 1 : 可以复用- 0 : 不可以复用- optlen : optval参数的大小
端口复用设置的时机是在服务器绑定端口之前。
setsockopt();
bind();