欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > 网络编程(历史,网络协议模型),预备知识,基于socket的TCP通信

网络编程(历史,网络协议模型),预备知识,基于socket的TCP通信

2025/2/12 14:45:26 来源:https://blog.csdn.net/musir1/article/details/145489339  浏览:    关键词:网络编程(历史,网络协议模型),预备知识,基于socket的TCP通信

网络编程

一、Internet历史

1968年:阿帕网(ARPAnet)问世,是internet的雏形。不能跨平台、跨操作系统、没有纠错功能

1974年:TCP协议出现,TCP协议可以实现跨平台、跨操作系统的操作,但是还是没有有效的纠错功能

1983年:TCP/IP协议公布​		能够实现跨平台、跨操作系统的操作​		能够有效地对通信数据实现纠错

协议:事先约定好的一组规则

二、网络协议模型

1、OSI七层协议模型(理论化模型)
物、数、网、传、会、表、应应用层:给用户以及应用程序提供网络服务
表示层:加密解密数据
会话层:建立网络通信节点
传输层:保证数据正确传输、实现点对点的通信
网络层:路由寻址
数据链路层:帧格式的封装、数据纠错、带宽处理.....
物理层:比特流的传输、光电信号转换
2、TCP/IP四层协议模型
应用层:HTTP(超文本传输协议)FTP(文件传输协议)NFS(网络挂载协议)DNS(域名解析协议)SSH(远程登陆协议)
传输层:TCP协议、UDP协议
网络层:IP协议、ICMP协议(跨传输层)ARP(IP->MAC)RARP(MAC->IP)手机号->身份证(唯一标识)
物理与网络接口层:以太网协议、ppp(拨号协议)、令牌环网(wifi)
3、TCP协议和UDP协议
共同点:都是属于传输层的协议
差异:TCP协议:面向连接,是一种安全可靠的,能够保证数据传输无误的一种通信协议应用场景:登录程序、传输重要文件UDP协议:无连接,是一种不安全可靠的,不能够保证数据传输无误的一种通信协议应用场景:流媒体软件、大型音视频传输
4、数据的封装与传递过程

在这里插入图片描述
在这里插入图片描述

三、预备知识

1、IP地址

​ 作用:在网络中唯一标识一台主机

​ 类型:

​ IPV4: 32位-4字节数据

​ 点分十进制:”1. 1. 1. 2“

​ 整数形式: 00000001 00000001 00000001 00000010

​ IPV6:128位 – 16字节

​ MAC地址:全球唯一标识

​ ARP(IP -> MAC)

​ RARP(MAC -> IP)
如果使用ifconfig命令查询不到ip地址
使用:sudo service network-manager restart

2、端口号 – port

​ 作用:一个端口号唯一标识一个进程

​ 类型:unsigned short类型的数据 2字节数据

​ 端口号的取值范围: 0 ~ 65535

​ 0 : 不能使用

​ 1 ~ 1023:系统端口

​ 1024 ~ 5000: 一般应用程序接口

​ 5001 ~ 65535: 提供给用户使用的自定义接口

3、字节序

​ 数据在内存中存储的方式

​ 大端序(网络字节序):高位的数据存放在低地址位

​ 小端序(主机字节序): 高位的数据存放在高地址位
在这里插入图片描述
网络中使用大端序存储,而在我们计算机中是小端序,为了不使数据出现错误,需要转换

​ ntohs(6789): 将网络字节序转换为主机字节序

​ htons(6789) : 将主机字节序转换为网络字节序

4、套接字 – socket

​ 本质:套接字是一种特殊的文件描述符

​ 主要用于网络通信
TCP的通信流程:
在这里插入图片描述

四、基于socket的TCP通信
1、创建套接字
   #include <sys/types.h>          /* See NOTES */#include <sys/socket.h>int socket(int domain, int type, int protocol);参数:domain:协议族AF_INET:internet协议 IPV4AF_UNIX:本地通信AF_INET6:internet协议 IPV6type:套接字类型SOCK_STREAM:流式套接字,唯一对应TCP通信SOCK_DGARM:数据报套接字,唯一对应UDP通信SOCK_RAW:原始套接字 protocol:默认填0返回值:成功返回套接字,失败返回-1
2、绑定本机IP地址和端口号
   #include <sys/types.h>          /* See NOTES */#include <sys/socket.h>不同的协议对应不同的地址结构(结构体)int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);参数:sockfd:套接字addr:对应地址结构的首地址addrlen: 地址结构的长度返回值:成功返回0,失败返回-1

  	IPV4对应的地址结构: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 */};使用方法:struct sockaddr_in saddr;saddr.sin_family = AF_INET; saddr.sin_port = htons(6666);  //将主机字节序转换为网络字节序之后再赋值saddr.sin_addr.s_addr = inet_addr("192.168.6.48"); //将点分十进制地址转换为整数再赋值

   		//inet_ntoa()
3、设置监听套接字
   #include <sys/types.h>          /* See NOTES */#include <sys/socket.h>int listen(int sockfd, int backlog);参数:sockfd:套接字backlog:设置最大连接等待队列个数返回值:成功返回0,失败返回-1
4、等待客户端连接
   #include <sys/types.h>          /* See NOTES */#include <sys/socket.h>int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);参数:sockfd:套接字addr:连接客户端的地址结构首地址addrlen:地址结构长度的地址返回值:成功返回一个用于服务器数据读写的套接字,失败返回-1;accept(sockfd, NULL, NULL);

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com