您现在的位置是:首页 >技术杂谈 >网络编程(历史,网络协议模型),预备知识,基于socket的TCP通信网站首页技术杂谈

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

musir1 2025-02-19 12:01:03
简介网络编程(历史,网络协议模型),预备知识,基于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协议 IPV4
   		AF_UNIX:本地通信
   		AF_INET6:internet协议 IPV6
   	type:套接字类型
   		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);

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。