网络编程 tcp udp http编程流程 网络基础知识

讲解

  • 网络基础知识
  • 网络编程
    • tcp编程流程
      • 图示理解
      • bind和accept函数理解
      • 监视套接字和链接套接字理解
      • linux和window下的编程实现
      • tcp特点
    • udp编程流程
      • 图示理解
      • udp特点
    • http编程流程
      • 图示+理解
      • 编程实现-网站服务器

网络基础知识

OSI分层:应用层 表示层 会话层 传输层 网络层 数据链路层 物理层
tcp/ip: 应用层 传输层 网络层 数据链路
ip地址:唯一标识一台主机
ipv4 32位 ipv6 128位 寻址 可以反映物理上的一个变化
MAC地址:48 固化在计算机中
ip地址又两部分构成:网络号+主机号
端口号:标识一个应用程序的代号 短整型
协议:共同遵守的约定 tcp协议 网络中的规则
ip , http/https,/ftp, tcp/
ipv4头部结构
在这里插入图片描述
4位头部长度:表示15行 每行4字节就是60字节 减去 基本的20字节 剩余的选项 40字节
TCP头部结构
在这里插入图片描述

剩余的选项仍然是 40字节
应用程序传递数据的一个过程
tcp协议

在这里插入图片描述
这四层:应用层 传输层 网络层 数据链路

在这里插入图片描述
ip地址由网络号和主机号共同构成的

"129.168.1.1"点分十进制转化为
无符号整型:
unsignal int inet_addr();
无符号整型转化为点分十进制:
inet_ntoa();
在这里插入图片描述
每一个字节8位 都是十进制转化的,最后将四个字节组合在一起,变成一个无符号整型

大端:网络字节序列 htons()
地址:ip+port

表示Ipv4的地址结构

struct socketaddr_in ipv4;

通用的套接字地址

struct socketaddr;

套接字
像手机一样进行数据的收发

需要让服务器先运行起来,客户端主动连接服务器,所以服务器需要把自己的ip 和端口告诉客户端

在Windows下查看ip地址

ipconfig

在这里插入图片描述

Linux下查看虚拟机ip地址

ifconfig

在这里插入图片描述
判断两个主机是否连通

ping 

在这里插入图片描述
无法访问目标主机 ,说明该网络下没有这个主机
请求超时,可能有防火墙 没有成功

网络编程

tcp编程流程

图示理解

tcp服务器 ,客户端编程流程
在这里插入图片描述

bind和accept函数理解

bind就是看看saddr得ip地址端口有没有问题,ip地址是不是写错了,端口是不是被占用了,如果没有问题,就将表示符合该地址绑定,取名成功

int c = accept(sockfd, (struct sockaddr *)&caddr, &len);

服务器会在该行阻塞,等待用户端的连接,一旦connect成功,阻塞结束,得到新的描述符c,该c对应刚才的客户端,类似一个链接,每个c都对应一个客户端,表示一条链接。

监视套接字和链接套接字理解

监听套接字 都是这一个 类似文件描述符 在一个进程中,fd都是3 不变
链接套接字:一个链接 由于服务器012 被占用 监视套接字是3 所以链接套接字从4开始,说明一个客户端和服务器链接上了,如果另一个客户端链接,那就是5 …
如果不理解,可以看这篇文章,讲的挺通俗易懂的:
监视套接字和链接套接字

int c = accept(sockfd,(struct sockaddr*) &caddr,&len);//阻塞
服务器刚开始是不知道客户端的地址的,所以先 &caddr 把结构体放这里,等客户端根据服务器给的ip端口找到connect,此时accept接收,这个时候就知道了客户端的地址和ip,存储在caddr

为什么c变成了4 原来的sockfd是3 而客户端的sockfd一直是3
类似用你的手机3给10086电话,你的电话号不变,一直是3 服务器类似一个服务中心,服务器刚开始也是10086 即3号手机接收,接听到了一个用户,就转接到另一个人工客服接听,即4 号手机,原来的3号手机继续接听客户的电话。一次类推。

linux和window下的编程实现

ser.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>int main()
{int sockfd = socket (AF_INET,SOCK_STREAM,0);if(sockfd == -1){exit(1);}struct sockaddr_in saddr, caddr;memset(&saddr,0,sizeof(saddr));saddr.sin_family = AF_INET;saddr.sin_port = htons(6000);saddr.sin_addr.s_addr = inet_addr("192.168.1.49");//“127.0.0.1”int res = bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));if ( res == -1){printf("bind err\n");exit(1);}res = listen(sockfd,5);if ( res == -1 ){exit(1);}while( 1 ){socklen_t len = sizeof(caddr);int c = accept(sockfd,(struct sockaddr*) &caddr,&len);//阻塞if ( c < 0 ){continue;}printf("accept c=%d\n",c);char buff[128] = {0};int n = recv(c,buff,127,0);//阻塞printf("buff=%s\n",buff);send(c,"ok",2,0);close(c);}
}

cli.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>int main()
{int sockfd = socket(AF_INET,SOCK_STREAM,0);if ( sockfd == -1){exit(1);}struct sockaddr_in saddr;memset(&saddr,0,sizeof(saddr));saddr.sin_family = AF_INET;saddr.sin_port = htons(6000);saddr.sin_addr.s_addr = inet_addr("192.168.1.49");int res = connect(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));if ( res == -1){printf("connect err\n");exit(1);}send(sockfd,"hello",5,0);char buff[128] = {0};recv(sockfd,buff,127,0);//okprintf("buff=%s\n",buff);close(sockfd);
}

Windows系统上的服务器和客户端

//window servier
#if 0
//ConsoleApptcp.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <WinSock2.h>   //网络头文件
#include <string.h>
#include <ws2tcpip.h>  //socklen_t
#include <iostream>using namespace std;
#pragma comment(lib, "ws2_32.lib")   //网络库文件//初始化网络库
void InitNetwork() {WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD(2, 2);err = WSAStartup(wVersionRequested, &wsaData);if (err != 0){return;}}int main()
{InitNetwork();SOCKET sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd == INVALID_SOCKET){cout << "socket err" << endl;return 0;}struct sockaddr_in saddr;memset(&saddr, 0, sizeof(saddr));saddr.sin_family = AF_INET;saddr.sin_port = htons(6000);//saddr.sin_addr.S_un.S_addr = INADDR_ANY;saddr.sin_addr.S_un.S_addr = inet_addr("192.168.1.32");//这个要用需要加宏定义//saddr.sin_addr.S_un.S_addr = inet_pton(AF_INET,"192.168.1.50",NULL);int res = bind(sockfd, (SOCKADDR*)&saddr, sizeof(saddr));if (res == SOCKET_ERROR){cout << "bind err" << endl;return 0;}if (listen(sockfd, 5) == SOCKET_ERROR){cout << "listen err" << endl;return 0;}while (true){//struct sockaddr_in caddr;SOCKADDR_IN caddr;socklen_t len = sizeof(caddr);int c = accept(sockfd, (SOCKADDR*)&caddr, &len);if (c == INVALID_SOCKET){continue;}cout << "accept c=" << c << endl;char buff[128] = { 0 };while (true){if (recv(c, buff, 127, 0) <= 0){break;}cout << buff << endl;send(c, "ok", 2, 0);}closesocket(c);}}
#endif//windows client 
#if 0
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <WinSock2.h>   //网络头文件
#include <string.h>
#include <ws2tcpip.h>  //socklen_t
#include <iostream>using namespace std;
#pragma comment(lib, "ws2_32.lib")   //网络库文件//初始化网络库
void InitNetwork() {WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD(2, 2);err = WSAStartup(wVersionRequested, &wsaData);if (err != 0){return;}}int main()
{InitNetwork();SOCKET sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd == INVALID_SOCKET){cout << "socket err" << endl;return 0;}struct sockaddr_in saddr;memset(&saddr, 0, sizeof(saddr));saddr.sin_family = AF_INET;saddr.sin_port = htons(6000);saddr.sin_addr.S_un.S_addr = inet_addr("192.168.1.49");int res = connect(sockfd, (struct sockaddr*)&saddr, sizeof(saddr));if (res == -1){cout << "connect err" << endl;closesocket(sockfd);WSACleanup();}while (true){cout << "input" << endl;char buff[128] = { 0 };cin >> buff;if (strncmp(buff, "end", 3) == 0){break;}send(sockfd, buff, strlen(buff), 0);memset(buff, 0, 128);recv(sockfd, buff, 127, 0);cout << buff << endl;}closesocket(sockfd);WSACleanup();return 0;
}
#endif

tcp特点

 int n = recv(c,buff,1,0);

一次只收一个字符
在这里插入图片描述

当发送速度快,会一起写到缓冲区,然后一起发送,数据太大,会拆开发送
在这里插入图片描述
套接字有发送缓冲区和接收缓冲区

netstat


应答确认 超时重传
乱序重拍 去重
滑动窗口控制
tcp特点
面向连接的 可靠的 流式服务

udp编程流程

图示理解

在这里插入图片描述

udp特点

无连接 不可靠 数据报服务
双方无连接:服务器关了,再起启动,发送消息还是能收到,在建立一个客户端,也可以发送信息。
udp发送数据时,要保证数据收完,否则其他数据就丢了
严格的一对一,发几次收几次

一个端口可以被一个套接字绑定,可以绑定两个,是协议不同
在这里插入图片描述
tcp在应用层面不丢数据,底层会丢,网络层,丢了重发就行,tcp自身保证其可靠性
tcp适合传文件 丢一个字节都不行
udp适合视频通话 丢包就是卡了

http编程流程

图示+理解

在这里插入图片描述

应用层 http 浏览器和服务器之间的通讯
传输层 tcp

两次以上的请求复用了同一个tcp连接,就是长连接
http用80号端口
https用443号端口
小于1024的端口,需要管理员才能访问
在这里插入图片描述
后面有\r\n结束

在这里插入图片描述
在这里插入图片描述
最后一行还有一个\r\n
content_length 不包含报头
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
服务器收到浏览器的信息,放到buff数组里,服务器知道了浏览器想访问的资源就是index.html,服务器需要做的是找到该资源,发给浏览器就行

在这里插入图片描述
浏览器会自己发起一个请求,去访问图标
这是一组请求,可能会有多次请求,在一次点击的过程中
在这里插入图片描述

编程实现-网站服务器

myhttp.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
#include<fcntl.h>
#define PATH "/home/ittao/code/day17"
int socket_init();
char *get_filename(char buff[])
{if(buff==NULL){return NULL;}char *ptr=NULL;char*s=strtok_r(buff," ",&ptr);if(s==NULL){return NULL;}printf("way:%s\n",s);s=strtok_r(NULL," ",&ptr);return s;
}
void *thread_fun(void *arg)
{int c = (int)arg;while (1){char buff[4096] = {0};int n = recv(c, buff, 4095, 0);if(n<=0){break;}printf("buff:%s\n", buff);char*filename=get_filename(buff);if(filename==NULL){send(c,"http err:404",12,0);break;}printf("filename:%s\n",filename);char path[256]={PATH};if(strcmp("/",filename)==0){strcat(path,"/index.html");}else{strcat(path,filename);}int fd=open(path,O_RDONLY);if(fd==-1){send(c, "http err:404", 12, 0);}int filesize=lseek(fd,0,SEEK_END);lseek(fd,0,SEEK_SET);char http_head[256]={" my HTTP/1.1 200 OK\r\n"};strcat(http_head,"Server:myhttp\r\n");sprintf(http_head+strlen(http_head),"Content-Length:%d\r\n",filesize);strcat(http_head,"\r\n");send(c,http_head,strlen(http_head),0);char data[1024];int num=0;while((num=read(fd,data,1024))>0){send(c,data,num,0);}close(fd);}close(c);printf("client close\n");pthread_exit(NULL);
}
int accept_client(int sockfd)
{struct sockaddr_in caddr;int len = sizeof(caddr);int c = accept(sockfd, (struct sockaddr *)&caddr, &len);return c;
}
int main()
{int sockfd = socket_init();if (sockfd == -1){exit(1);}while (1){int c=accept_client(sockfd);if (c != -1){pthread_t id;pthread_create(&id, NULL, thread_fun, (void *)c);} }
}
int socket_init()
{int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd == -1){return -1;}struct sockaddr_in saddr;memset(&saddr, 0, sizeof(saddr));saddr.sin_family = AF_INET;saddr.sin_port = htons(80);saddr.sin_addr.s_addr = inet_addr("192.168.1.49");int res = bind(sockfd, (struct sockaddr *)&saddr, sizeof(saddr));if (res == -1){printf("bind err\n");return -1;}res = listen(sockfd, 5);if (res == -1){return -1;}return sockfd;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/28399.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springBoot集成caffeine,自定义缓存配置 CacheManager

目录 springboot集成caffeine Maven依赖 配置信息&#xff1a;properties文件 config配置 使用案例 Caffeine定制化配置多个cachemanager springboot集成redis并且定制化配置cachemanager springboot集成caffeine Caffeine是一种基于服务器内存的缓存库。它将数据存储在…

【MongoDB】解决ProxmoxVE下CentOS7虚拟机安装MongoDB6后启动失败的问题

目录 安装步骤&#xff1a; 2.1 配置yum源 2.2 安装MongoDB 2.3 启 动MongoDB ProxmoxVE上新装的CentOS7.4虚拟机&#xff0c;安装MongoDB6。 安装步骤&#xff1a; 2.1 配置yum源 # 创建mongodb yum源&#xff08;https://www.mongodb.com/docs/manual/tutorial/insta…

clickhouse调研报告2

由Distributed表发送分片数据 clickhouse分区目录合并 clickhouse副本协同流程 clickhouse索引查询逻辑 clickhouse一级索引生成逻辑(两主键) clickhouse的data目录下包含如下目录: [root@brfs-stress-01 201403_10_10_0]# ll /data01/clickhouse/data total 4 drwxr-x---…

【Vue3】插槽全家桶

插槽&#xff08;Slots&#xff09;是 Vue.js 框架中的一个功能&#xff0c;允许在组件内部预留一些可替换的内容。通过插槽&#xff0c;可以给父组件填充模板代码&#xff0c;让父组件向子组件传递自定义的内容&#xff0c;以便在子组件中进行展示或处理。 1. 匿名插槽 Son.…

初次使用GPU云服务器

前言&#xff1a; 在体验了GPU云服务器&#xff08;GPU Cloud Computing&#xff0c;GPU&#xff09;后&#xff0c;我认为这是一个非常强大的弹性计算服务。它为深度学习、科学计算、图形可视化、视频处理等多种应用场景提供了强大的GPU算力&#xff0c;能够满足各类用户的计算…

【动态规划】数字三角形

算法提高课课堂笔记。 文章目录 摘花生题意思路代码 最低通行费题意思路代码 方格取数题意思路代码 摘花生 题目链接 Hello Kitty想摘点花生送给她喜欢的米老鼠。 她来到一片有网格状道路的矩形花生地(如下图)&#xff0c;从西北角进去&#xff0c;东南角出来。 地里每个道…

UML—浅谈常用九种图

目录 概述: 1.用例图 2.静态图 3.行为图&#xff1a; 4.交互图&#xff1a; 5.实现图&#xff1a; 概述: UML的视图是由九种视图组成的&#xff0c;分别是用例图、类图、对象图、状态图、活动图、序列图、协作图、构件图、实施图。我们可以根据这9种图的功能和实现的目的…

RocketMQ发送消息超时异常

说明&#xff1a;在使用RocketMQ发送消息时&#xff0c;出现下面这个异常&#xff08;org.springframework.messging.MessgingException&#xff1a;sendDefaultImpl call timeout……&#xff09;&#xff1b; 解决&#xff1a;修改RocketMQ中broke.conf配置&#xff0c;添加下…

枫叶时代:打造中国特色的传统文化IP

近年来&#xff0c;取材于传统文化的影视作品在文化产业市场受到前所未有的关注。作为一种兼具辨识度、影响力和流量变现能力的文化符号&#xff0c;影视IP既是文化产业的一个重要环节&#xff0c;也是国家文化软实力的直接体现。优秀的影视IP可以超越文字、语言、民族的障碍&a…

滑动窗口(全面清晰/Java)

数组模拟单调队列 分析 以k3举例&#xff1a; (1)利用单调队列的性质&#xff1a; <1>最小值&#xff1a;确保队列单调递增&#xff0c;处理后&#xff0c;队头即是最小值。 <2>最大值&#xff1a;确保队列单调递减&#xff0c;处理后&#xff0c;队头即是最大值…

做接口测试如何上次文件

在日常工作中&#xff0c;经常有上传文件功能的测试场景&#xff0c;因此&#xff0c;本文介绍两种主流编写上传文件接口测试脚本的方法。 首先&#xff0c;要知道文件上传的一般原理&#xff1a;客户端根据文件路径读取文件内容&#xff0c;将文件内容转换成二进制文件流的格式…

yolov2检测网数据集标注_labelme使用_json2txt格式转换

yolov2检测网数据集标注_labelme使用_json2txt格式转换 一、安装Anaconda二、创建labelme虚拟环境三、使用labelme标注健康非健康猫狗数据3.1 打开数据集所在文件夹3.2 进行标注数据集3.3 json2txt3.4 按文件目录和训练测试数据集重分配 四、数据喂给服务器网络参考链接 一、安…

网络安全---正则回溯

目录 一、题目引入 二、举出回溯例子进行分析 第一步&#xff1a; 正则往前匹配 第二步&#xff1a;匹配到头 第三步&#xff1a;往回匹配 第四步&#xff1a;直到分号结束 &#xff08;匹配上&#xff09; 原因&#xff1a; 三、进入正题一&#xff08;分析题型&#x…

MongoDB创建用户 、数据库、索引等基础操作

MongoDB的权限认证是相对来说比较复杂的&#xff0c;不同的库创建后需要创建用户来管理。 本机中的MongoDB是docker 启动的&#xff0c;所以先进入docker的镜像中 docker exec -it mongodb bash 这样就进入到了镜像MongoDB中&#xff0c;然后输入命令连接MongoDB数据库 注…

有效管理IT问题的5个原则

问题管理就是发现未知的、隐藏的问题&#xff0c;这是根本原因&#xff0c; 这是您 IT 帮助台无穷无尽的工单来源。当您实施有效的 问题管理&#xff0c;您的 IT 团队可以超越消防模式&#xff0c;专注于战略 IT 目标。以下是可以帮助您实现一流问题管理的五个原则&#xff1a;…

网络安全 Day30-运维安全项目-堡垒机部署

运维安全项目-堡垒机部署 1. 运维安全项目-架构概述2. 运维安全项目之堡垒机2.1 堡垒机概述2.2 堡垒机选型2.3 环境准备2.4 部署Teleport堡垒机2.4.1 下载与部署2.4.2 启动2.4.3 浏览器访问teleport2.4.4 进行配置2.4.5 安装teleport客户端 2.5 teleport连接服务器 1. 运维安全…

中介者模式(Mediator)

中介者模式是一种行为设计模式&#xff0c;可以减少对象之间混乱无序的依赖关系。该模式会限制对象之间的直接交互&#xff0c;迫使它们通过一个封装了对象间交互行为的中介者对象来进行合作&#xff0c;从而使对象间耦合松散&#xff0c;并可独立地改变它们之间的交互。中介者…

开源语言模型的历史和重要性;Edge浏览器将推出Bing AI重写文本功能

&#x1f989; AI新闻 &#x1f680; 微软即将推出桌面版Microsoft Edge浏览器的Bing AI重写文本功能 摘要&#xff1a;微软最近在桌面版Microsoft Edge浏览器中引入了一个新功能&#xff0c;允许用户使用Bing AI重写文本。用户可以选择不同的语气、格式和长度&#xff0c;然…

SpringMVC的架构有什么优势?——异常处理与文件上传(五)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

(十二)大数据实战——hadoop集群之HDFS高可用自动故障转移

前言 本节内容主要介绍一下hadoop集群下实现HDFS高可用的自动故障转移&#xff0c;HDFS高可用的自动故障转移主要通过zookeeper实现故障的监控和主节点的切换。自动故障转移为 HDFS 部署增加了两个新组件&#xff1a;ZooKeeper 和 ZKFailoverController &#xff08;ZKFC&…