您现在的位置是:首页 >技术杂谈 >网络编程(历史,网络协议模型),预备知识,基于socket的TCP通信网站首页技术杂谈
网络编程(历史,网络协议模型),预备知识,基于socket的TCP通信
简介网络编程(历史,网络协议模型),预备知识,基于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);
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。