网络编程(一)基本概念、TCP协议

文章目录

  • 一、概念
    • (一)网络发展阶段
      • 1. ARPAnet阶段
      • 2. TCP/IP两个协议阶段
      • 3. 网络体系结构和OSI开放系统互联模型
      • 4. TCP/IP协议簇体系结构
        • (1) 应用层:
        • (2)传输层:
        • (3)网络层:
        • (4)链路层:
    • (二)TCP和UDP的异同
    • (三)网络基础知识
      • 1. 字节序
      • (1)实现将四字节无符号整型转为大端字节序功能
        • (2)字节序转换函数
      • 2. socket
        • (1)概念
        • (2)类型
      • 3. IP地址
      • 4. 端口号
  • 二、TCP网络编程
    • (一)流程
    • (二)相关函数
      • 1. socket
      • 2. bind
      • 3. listen
      • 4. accept
      • 5. connect
    • (三)虚拟机的NAT模式和桥接模式

一、概念

协议:通信的双方都遵循的,如何发送数据以及接到数据后如何解析的一个规则。
网络体系结构:指网络的层次结构和每层所使用协议的集合

(一)网络发展阶段

1. ARPAnet阶段

早期的ARPAnet使用网络控制协议(Network Control Protocol,NCP),
不能互联不同类型的计算机和不同类型的操作系统,没有纠错功能

2. TCP/IP两个协议阶段

TCP/IP协议分成了两个不同的协议:
用来检测网络传输中差错的传输控制协议TCP
专门负责对不同网络进行互联的互联网协议IP

3. 网络体系结构和OSI开放系统互联模型

  • 应用层
  • 表示层
  • 会话层
  • 传输层
  • 网络层
  • 数据链路层
  • 物理层

4. TCP/IP协议簇体系结构

对OSI开放系统模型做了简化
在这里插入图片描述

(1) 应用层:

HTTP(Hypertext Transfer Protocol) 超文本传输协议
万维网的数据通信的基础

FTP(File Transfer Protocol) 文件传输协议
是用于在网络上进行文件传输的一套标准协议,使用TCP传输

TFTP(Trivial File Transfer Protocol) 简单文件传输协议
是用于在网络上进行文件传输的一套标准协议,使用UDP传输

SMTP(Simple Mail Transfer Protocol) 简单邮件传输协议
一种提供可靠且有效的电子邮件传输的协议

(2)传输层:

TCP(Transport Control Protocol) 传输控制协议
是一种面向连接的、可靠的、基于字节流的传输层通信协议

UDP(User Datagram Protocol) 用户数据报协议
是一种无连接、不可靠、快速传输的传输层通信协议

(3)网络层:

IP(Internetworking Protocol) 网际互连协议
是指能够在多个不同网络间实现信息传输的协议

ICMP(Internet Control Message Protocol) 互联网控制信息协议
用于在IP主机、路由器之间传递控制消息----ping命令使用的协议

IGMP(Internet Group Management Protocol) 互联网组管理
是一个组播协议,用于主机和组播路由器之间通信

(4)链路层:

ARP(Address Resolution Protocol) 地址解析协议
通过IP地址获取对方mac地址

RARP(Reverse Address Resolution Protocol) 逆向地址解析协议
通过mac地址获取ip地址

(二)TCP和UDP的异同

相同点:
同为传输层的协议

不同点:
TCP:有连接,可靠
UDP:无连接,不保证可靠

TCP(即传输控制协议):
是一种面向连接的传输层协议,它能提供高可靠性通信
(即数据无误、数据无丢失、数据无失序、数据无重复到达的通信)

UDP(User Datagram Protocol)用户数据报协议:
是不可靠的无连接的协议。在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输。

(三)网络基础知识

1. 字节序

不同类型CPU的主机中,内存存储多字节整数序列有两种方法,称为主机字节序(HBO):
小端序(little-endian) - 低序字节存储在低地址
将低字节存储在起始地址,称为“Little-Endian”字节序,Intel、AMD等采用的是这种方式;
大端序(big-endian)- 高序字节存储在低地址
将高字节存储在起始地址,称为“Big-Endian”字节序,由ARM、Motorola等所采用

  • 注:为了保证收发数据的一致性,就发明了网络字节序(大端序) 。发送方发送数据时,需要先把数据转成网络字节序再发送,接收方接到的数据默认都认为是网络字节序的数据,需要转成主机字节序再处理。

(1)实现将四字节无符号整型转为大端字节序功能

#include <stdio.h>
//判断本主机是大端还是小端
union _num
{
    int a;
    char b;
};

int if_big_1(void){
    union _num num;
    num.a = 0x12345678;
    return (0x12 == num.b)?1:0;
}
/***第二种判断主机是大端还是小端的方法***/
int if_big_2(void){
    int num = 0x12345678;
    char *p = (char *)&num;
    return (0x12 == *p)?1:0;
}

int my_htonl(int num){
    if(!if_big_1()){
        //如果是小端字节序,需要转成大端字节序
        char *p = (char *)&num;
        char *q = p+3;
        char temp=0;
        //第0位和第3位交换
        temp = *p;
        *p = *q;
        *q = temp;
        //第1位和第2位交换
        p++;
        q--;
        temp = *p;
        *p = *q;
        *q = temp;
    }
    return num;
}

int main(int argc, char const *argv[])
{
    int num = 0x12345678;
    if(!if_big_2()){
        printf("本机为小端存储,%#x-->%#x\n",num, my_htonl(num));
    }else{
        printf("本机为大端存储,%#x-->%#x\n",num, my_htonl(num));
    }
    return 0;
}
(2)字节序转换函数
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);  //主机转网络4字节
uint16_t htons(uint16_t hostshort); //主机转网络2字节
uint32_t ntohl(uint32_t netlong);   //网络转主机4字节
uint16_t ntohs(uint16_t netshort);  //网络转主机2字节
// h  host 主机  to  转换  n  network 网络  l  四字节  s 二字节
  • 注:
    1.如果明确知道收发双方的主机字节序一致,可以不考虑字节序问题
    2.多字节的整形序列需要考虑字节序的问题 (字符串可以不考虑)

2. socket

套接字通信是进程间(而非主机之间)通信的方式的一种。

(1)概念

socket是一个函数,会返回一个文件描述符,用户可以通过传参的方式指定收发数据时需要封装和解析什么协议。

socket并不仅限于linux,也并不限于TCP/IP协议族体系结构

(2)类型

流式套接字(SOCK_STREAM)----给TCP用的
提供了一个面向连接、可靠的数据传输服务,数据无差
错、无重复的发送且按发送顺序接收。内设置流量控制,
避免数据流淹没慢的接收方。数据被看作是字节流,
无长度限制。

数据报套接字(SOCK_DGRAM)----给UDP用的
提供无连接服务。数据包以独立数据包的形式被发送,
不提供无差错保证,数据可能丢失或重复,顺序发送,
可能乱序接收。

原始套接字(SOCK_RAW)
可以对较低层次协议如IP、ICMP直接访问。

3. IP地址

局域网内部使用MAC地址通信,如果使用互联网,必须用IP地址

IP地址的表示形式 “192.168.80.10” 这种叫做点分十进制,是一个字符串
计算机中存储IP地址是用的无符号4字节整型。unsigned int

#include <my_head.h>

int is_big(void){
    int num = 0x12345678;
    char *p = (char *)&num;
    return (0x12 == *p)?1:0;
}

int incept_char(char *p,char *str){
    int i=0;
    while('.' != *p&& '\0' != *p){
        str[i]=*(p++);
        i++;
    }
    return i;//返回.的坐标位置
}

int main(int argc, char const *argv[])
{
    if(2 != argc){
        printf("Usage:%s IPv4\n",argv[0]);
        exit(-1);
    }
    //截取字符串
    char str1[4]={0};
    char str2[4]={0};
    char str3[4]={0};
    char str4[4]={0};
    
    char p[20]={0};
    strcpy(p,argv[1]);

    int i=0,j=0;
    j = incept_char(p,str1);
    i=i+j+1;
    j = incept_char(p+i,str2);
    i=i+j+1;
    j = incept_char(p+i,str3);
    i=i+j+1;
    incept_char(p+i,str4);
    //将截取的字符串转成整型
    int num[4]={0};
    num[0] = atoi(str1);
    num[1] = atoi(str2);
    num[2] = atoi(str3);
    num[3] = atoi(str4);

    //组装成四字节无符号整型数,且为大端    
    unsigned int my_ip=0;
    printf("%ld\n",sizeof(my_ip));
    /***注意此处必须是unsigned char类型的指针,否则会打印出负数***/
    unsigned char *q = (unsigned char *)&my_ip;
    if(!is_big()){
        for(int m=0;m<4;m++){
            *(q+m)= *(char*)(num+m);
        }
    }else{//小端:地址低位存储数据低位
        for(int m=0;m<4;m++){
            *(q+m)= *(char*)(num+3-m);
        }
    }
    
    q=(unsigned char *)&my_ip;
    printf("%s --> %d.%d.%d.%d\n", argv[1], q[0], q[1],q[2], q[3]);
    return 0;
}
	
//将点分十进制的字符串 转换成  网络字节序的 无符号四字节整型
in_addr_t inet_addr(const char *cp);

//将网络字节序的无符号四字节整型的ip地址 转换成 点分十进制的字符串
char *inet_ntoa(struct in_addr in);

4. 端口号

端口号是用来人为的标识某一个进程

端口号范围[0-65535],usigned short
实际开发时,端口由用户指定

linux系统中 /etc/services 中保存的就是当前系统中已经被占用的端口号

服务端口号
ftp21
ssh22
tftp69
http80 8080
mysql3306

二、TCP网络编程

网络编程模型:
C/S模型:客户端服务器模型
优点:
客户端可以缓存一些数据,使用时直接在本地读取,无需每次重新下载
由于客户端和服务器都是自己开发的,可以自定义协议
缺点:代码开发量大

B/S模型:浏览器服务器模型

(一)流程

在这里插入图片描述
服务器流程
创建套接字–socket()
填充服务器的网络信息结构体
将套接字与服务器网络信息结构体绑定–bind()
将套接字设置成被动监听状态–listen()
阻塞客户端连接–accept()
收发数据–write()/read()
关闭套接字–close()

客户端流程
创建套接字–socket()
填充服务器的网络信息结构体
与服务器建立连接–connect()
收发数据–write()/read()
关闭套接字–close()

(二)相关函数

1. socket

#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
功能:
    创建套接字
参数:
    domain:通信域
        AF_UNIX  AF_LOCAL  本地通信使用
        AF_INET            IPV4使用
        AF_INET6          IPV6使用
        AF_PACKET          原始套接字使用
    type:套接字类型
        SOCK_STREAM      TCP使用
        SOCK_DGRAM       UDP使用
    protocol:附加协议 传0 表示没有附加协议
返回值:
    成功  套接字(文件描述符)
    失败  -1  重置错误码

2. bind

#include <sys/types.h>
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
功能:
    将套接字与服务器网络信息结构体绑定
参数:
    sockfd:套接字
    addr:网络信息结构体的首地址
        struct sockaddr {
            sa_family_t sa_family;
            char        sa_data[14];
        }
        //上面的结构体只是用来强转 防止编译警告的 
        //实际使用的是下面的结构体
        struct sockaddr_in {
            sa_family_t    sin_family; /* AF_INET */
            in_port_t      sin_port;   /* 网络字节序的端口号 */
            struct in_addr sin_addr;   /* 网络地址 */
        };
        struct in_addr {
            uint32_t       s_addr;     /* 网络字节序无符号4字节整型的IP地址 */
        };
    addrlen:addr的长度
返回值:
    成功  0
    失败  -1  重置错误码

3. listen

#include <sys/types.h>
#include <sys/socket.h>
int listen(int sockfd, int backlog);
功能:
    将套接字设置成被动监听状态
参数:
    sockfd:套接字
    backlog:指定半连接队列的最大长度
            一般传 5  10  等都可以 不是 0 就行
            //因为我们实际开发时 一般都是并发服务器 基本能维持半连接队列中没有元素
返回值:
    成功  0
    失败  -1  重置错误码

4. accept

阻塞等待客户端连接

#include <sys/types.h>
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:
    提取半连接队列中的第一个链接,会返回一个新的套接字专门用于和该客户端通信
    如果半连接队列中没有连接请求 accept函数会阻塞
参数:
    sockfd:套接字 必须是已经绑定了本地地址 且置成被动监听状态的
    addr:用于保存客户端的网络信息结构体的缓冲区的首地址 不关心可以传NULL
    addrlen:addr的大小,不关心也可以传NULL
返回值:
    成功  新的套接字用于收发数据
    失败  -1  重置错误码

5. connect

#include <sys/types.h>
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
功能:
    与服务器建立连接
参数:
    sockfd:套接字
    addr:要连接的服务器的网络信息结构体的首地址
    addrlen:addr的长度
返回值:
    成功  0
    失败  -1  重置错误码

(三)虚拟机的NAT模式和桥接模式

桥接模式:

NAT模式

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电商平台“质价比”增量密码,藏在美妆价格战里

文&#xff5c;新熔财经 作者&#xff5c;宏一 电商平台越来越难赚到用户的钱了。 数据显示&#xff0c;今年4月&#xff0c;抖音护肤与彩妆总GMV达141.72亿元&#xff0c;同比增长32.66%&#xff0c;环比下滑8.87%。 即便是最受关注的美妆类淘宝主播李佳琦&#xff0c;今年…

【网络编程】基于TCP的服务器端/客户端

TCP是Transmission Control Protocol(传输控制协议)简写。因为TCP套接字是面向连接的&#xff0c;因此又称为基于流的套接字。 把协议分为多个层次&#xff0c;设计更容易&#xff0c;通过标准化操作设计开放式系统 网络层介绍 链路层 链路层是物理连接领域标准化的结果&…

推荐系统三十六式学习笔记:原理篇.近邻推荐09|协同过滤中的相似度计算方法有哪些?

目录 相似度的本质相似度的计算方法&#xff1a;1、欧式距离2、余弦相似度3、皮尔逊相关度4 、杰卡德&#xff08;Jaccard&#xff09;相似度 总结 相似度的本质 推荐系统中&#xff0c;推荐算法分为两个门派&#xff0c;一个是机器学习派&#xff0c;一个是相似度门派。机器学…

网络编程2----UDP简单客户端服务器的实现

首先我们要知道传输层提供的协议主要有两种&#xff0c;TCP协议和UDP协议&#xff0c;先来介绍一下它们的区别&#xff1a; 1、TCP是面向连接的&#xff0c;UDP是无连接的。 连接的本质是双方分别保存了对方的关键信息&#xff0c;而面向连接并不意味着数据一定能正常传输到对…

天熠电脑怎么更换文件夹位置?三种方法,轻松驾驭

在日常使用电脑的过程中&#xff0c;文件夹的管理和整理对于提升工作效率和保持桌面整洁至关重要。然而&#xff0c;随着文件的不断增多和项目的频繁切换&#xff0c;我们可能需要不断调整文件夹的位置以适应新的工作需求。今天&#xff0c;我们就以天熠电脑为例&#xff0c;为…

LeetCode | 20.有效的括号

这道题就是栈这种数据结构的应用&#xff0c;当我们遇到左括号的时候&#xff0c;比如{,(,[&#xff0c;就压栈&#xff0c;当遇到右括号的时候&#xff0c;比如},),]&#xff0c;就把栈顶元素弹出&#xff0c;如果不匹配&#xff0c;则返回False&#xff0c;当遍历完所有元素后…

“圆周素数”算法题解析

什么是圆周素数&#xff1f; 将一个素数逐位轮转后&#xff0c;所得到的数依然是素数&#xff0c;那么就称这个数为圆周素数。 例如&#xff1a;197是一个素数&#xff0c;将它逐位轮转后所得到的数&#xff0c;971&#xff0c;719 依然是素数。 小于100的圆周素数一共有13个…

HLS入门实验

文章目录 一、HLS介绍1.1 什么是HLS1.2HLS与VHDL/Verilog编程技术有什么关系?1.3HLS的关键技术和技术局限性1.3.1关键技术1.3.2 技术局限性 二、HLS入门实验2.1安装Vivado2.2创建项目2.3添加文件2.4仿真2.5创建Vivado工程2.6生成IP核2.7添加代码 参考 一、HLS介绍 1.1 什么是…

MySQL的发展历程:欧洲诞生,中国兴盛,美国低谷

目录 1 早期历史 2 成长与发展 3 重大变化和收购 4 现代发展 5 结语 一直比较写一些数据库相关的技术和操作、优化等文章。但写数据库在中国一般也逃脱不了MySQL这个数据库。下面简单谈一些个人看法。 MySQL整体上是起于欧洲&#xff1a; 一直有开源社区运营&#xff0c…

社会组织上前台、高质量发展勇担当|番禺区社联会成立十周年大会

6月5日&#xff0c;番禺区社联会举行“社会组织上前台&#xff0c;高质量发展勇担当”庆祝成立十周年大会暨“百社联百村—助力百千万工程”专项行动启动仪式。 广东省社会组织总会副秘书长王洁珊&#xff0c;广州市民政局一级调研员李又文&#xff0c;番禺区委副书记、区长叶珊…

网络安全到底是什么?一篇概念详解(附学习资料)

一、什么是网络安全&#xff1f;&#xff08;文末有资料&#xff09; “网络安全是指网络系统的硬件、软件及其系统中的数据受到保护&#xff0c;不因偶然的或者恶意的原因而遭受到破坏、更改、泄露、系统连续可靠正常地运行&#xff0c;网络服务不中断。” 说白了网络安全就…

集合java

1.集合 ArrayList 集合和数组的优势对比&#xff1a; 长度可变 添加数据的时候不需要考虑索引&#xff0c;默认将数据添加到末尾 package com.itheima;import java.util.ArrayList;/*public boolean add(要添加的元素) | 将指定的元素追加到此集合的末尾 | | p…

DOM-获取元素

获取元素的方法&#xff1a; 方法一&#xff1a;根据id获取元素document.getElementById <div id"time">2024-6-4</div> 在script标签中&#xff1a;注意getElementById括号里面必须要有引号&#xff0c;获得的是对象类型 var timer document.getEle…

harmony相关开发参考文档

以下列举一些Harmony Os应用开发文档以及相关参考开源案例&#xff0c;可协助高效率开发&#xff1a; 1.鸿蒙NEXT开发官方资料&#xff1a;包含鸿蒙NEXT开发所有的特性&#xff0c;HarmonyOS SDK等&#xff0c;可以按需查阅&#xff0c;需要开通白名单&#xff1a;应用开发导读…

2024版CorelDRAW中文破解授权码激活码!立即下载CorelDRAW中文版终身永久破解下载攻略

在设计领域&#xff0c;CorelDRAW一直以其强大的图形编辑和矢量绘图功能而受到专业用户的青睐。随着CorelDRAW 2024的发布&#xff0c;设计师们迎来了更加丰富的工具和更新的功能&#xff0c;使得创意实现更为轻松和精准。对于追求成本效益的用户而言&#xff0c;CorelDRAW 202…

【SpringBoot + Vue 尚庭公寓实战】房间支付方式管理接口实现(三)

【SpringBoot Vue 尚庭公寓实战】房间支付方式管理接口实现&#xff08;三&#xff09; 文章目录 【SpringBoot Vue 尚庭公寓实战】房间支付方式管理接口实现&#xff08;三&#xff09;1、查询全部支付方式列表2、保存或更新支付方式3、根据ID删除支付方式 房间支付方式管理…

express入门03增删改查

目录 1 搭建服务器2 静态文件托管3 引入bootstrap4 引入jquery5 编写后端接口5.1 添加列表查询方法5.2 添加路由5.3 添加数据表格 总结 我们前两篇介绍了如何利用express搭建服务器&#xff0c;如何实现静态资源托管。那利用这两篇的知识点&#xff0c;我们就可以实现一个小功能…

如何手动实现multiSetIfAbsent、multiExpire

👽System.out.println(“👋🏼嗨,大家好,我是代码不会敲的小符,目前工作于上海某电商服务公司…”); 📚System.out.println(“🎈如果文章中有错误的地方,恳请大家指正!共同进步,共同成长✊”); 🌟System.out.println(“💡如果文章对您有所帮助,希望您可以三…

Multimodal Dynamics:用于多模态融合背景下的分类

Multimodal Dynamics&#xff08;MD&#xff09;是可信赖的多模态分类算法&#xff0c;该算法动态评估不同样本的特征级和模态级信息量&#xff0c;从而可信赖地对多模态进行融合。 来自&#xff1a;Multimodal Dynamics: Dynamical Fusion for Trustworthy Multimodal Classi…

2、python 基础学习总结

文章目录 一、python 标识符和变量命名规则1、python 标识符2 python 变量和变量命名规则 二、数据类型2.1 Numbers&#xff08;数字类型&#xff09;2.2 String&#xff08;字符串类型&#xff09;2.2.1 单引号、双引号、三引号字符串之间的区别2.2.2 转义字符 在这里插入图片…