Linux网络通信

网络

网络:进程间通信(不同主机)

1.主机1和主机2物理层互联互通
2.主机1和主机2软件层面互联互通

网络协议

网络协议:OSI七层模型

应用层:要传输的数据信息,如文件传输,电子邮件等	
表示层:数据加密,解密操作,压缩,解压缩	
会话层:建立数据传输通道
传输层:传输的方式  UDP  TCP   端口号
网络层:实现数据路由    路由器  ip
数据链路层:封装成帧,点对点通信(局域网内通信),差错检测   交换机 ARP协议
物理层:定义物理设备标准,比如网线,光纤等传输介质   比特流  bit  0 1

ARP:地址解析协议(数据链路层)

MAC:硬件地址

TCP/IP模型:  工业模型
4层
应用层:HTTP、HTTPS、FTP、TFTP、MQTT
传输层:TCP、UDP
网络层:IP
网络接口层:网络接口层既是传输数据的物理媒介,也可以为网络层提供一条准确无误的线路

5层
应用层:HTTP、HTTPS、FTP、TFTP、MQTT
传输层:TCP、UDP
网络层:IP
数据链路层:封装成帧,点对点通信(局域网内通信),差错检测   交换机
物理层:定义物理设备标准,比如网线,光纤等传输介质   比特流  bit

协议

协议:

应用层协议:
	FTP:文件传输协议(实现文件上传/下载)
	TFTP:简单文件传输协议(实现文件上传/下载)
	HTTP:超文本传输协议(实现超文本(集视频、图片、文字于一体的文件类型)传输)
	HTTPS:加密版超文本传输协议
	MQTT:消息队列遥测传输协议(物联网传输)
传输层协议:
	UDP:用户数据报协议
	1.面向数据包,无需建立连接
	2.不安全、不可靠(可能存在数据的丢失和乱序),尽最大可能交付。
	3.实时性好
	4.机制简单 占用资源少
	TCP:传输控制协议(流式套接字)
	1.建立(面向)连接
	2.面向数据流
	3.安全、可靠
	4.机制复杂、资源开销较大
	TCP传输时有粘包问题
	粘包问题解决方案:
	1.发送指定大小(每次发送多少则收多少)
	适用于:通信时,字节大小始终固定的场景
	2.通信协议可边长
	  自定义协议(应用层)
网络层:
	IP协议:
	192.168.1.128
	IPv4    32位
	IPv6    128位

网络相关命令

1.ifconfig
2.ping ip 地址/域名
查看网络是否连通
dns(域名解析服务)

网络编程模型
C/S模型: client----->server 专用的客户端
B/S模型 : browesr ---->server 通用的客户端
UDP(用户数据报):
传输层协议
网络套接字:文件描述符 为应用层提供的端口

客户端:----------------------------服务端
创建套接字:	socket()--------------------------socket()
sendto()--------------------------bind()绑定自己的身份:IP+端口号(区分进程)
recvfrom()------------------------recevfrom()
close()---------------------------sendto()
------------------------------------close()

1.socket

int socket(int domain, int type, int protocol);
功能:创建通信网络套接字
参数:
domain:使用ip的协议
				AF_INET     IPv4
				AF_INET6   IPv6
type:传输层的协议类型
                SOCK_STREAM:流式套接字,使用 TCP 协议(面向连接、可靠的)
				SOCK_DGRAM:数据报套接字,使用 UDP 协议(无连接、不可靠的)
				SOCK_RAW:原始套接字,用于直接访问网络层
protocol(协议):
通常设置为 0,表示使用默认协议(与 type 配合使用)
返回值:
成功时:返回一个非负整数,表示套接字的文件描述符。
失败时:返回 -1,并设置 errno

2.sendto

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
功能:向一个IP地址和端口发送数据信息
     端口号:区分一台主机不同的应用程序(0-65535)
参数:
      sockfd:套接字文件描述符,表示一个已经创建的套接字。这个套接字通常是通过 socket() 函数创建的,并且需要绑定到一个本地地址(对于 UDP)
      buf:指向要发送数据的缓冲区的指针,数据从这个缓冲区中读取
      len:要发送的数据的长度,以字节为单位。这个值通常是 buf 中数据的实际长度
      flags:用于控制发送行为的标志。常用的标志有:
                                               0:默认值,表示正常发送。
                                               MSG_CONFIRM:要求确认数据的传输。
                                               MSG_DONTROUTE:发送数据时绕过路由表
      dest_addr:指向一个 sockaddr 结构体的指针,指定目标地址。对于 UDP 套接字,这个参数是必须的,它包含目标主机的 IP 地址和端口号。
      
      addrlen:dest_addr 参数所指向的地址结构体的长度,以字节为单位。通常是 sizeof(struct sockaddr_in) 或 sizeof(struct sockaddr_in6),具体取决于使用的地址族(IPv4 或 IPv6)。

      struct sockaddr 			通用地址类型	
      struct sockaddr_in 			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 */
    };
	struct in_addr {
	   uint32_t       s_addr;     /* address in network byte order */
    };	      

3.htons

htons(主机转网络字节序)
h:host(主机)
n:net(网络)

  uint32_t htonl(uint32_t hostlong);          主机转网络
  uint16_t htons(uint16_t hostshort);         主机转网络
  uint32_t ntohl(uint32_t netlong);           网络转主机
  uint16_t ntohs(uint16_t netshort);          网络转主机

4.inet_addr

in_addr_t inet_addr(const char *cp);
功能:
	将字符串IP地址转换成二进制IP地址形式

5.inet_ntoa

char *inet_ntoa(struct in_addr in);
  功能:将二进制ip转换成字符串

6.bind

int bind(int sockfd, const struct sockaddr *addr,
            socklen_t addrlen);
功能:将一个套接字与IP地址和端口号绑定(只能绑定自己的IP地址)
参数:
      sockfd:已经创建并可能已经连接的套接字描述符,通常是 socket() 函数的返回值
      addr:指向一个 sockaddr 结构体的指针,包含了要绑定的本地地址信息。这个结构体可以是 sockaddr_in 或者 sockaddr_in6,具体取决于你想要绑定的地址类型(IPv4 或 IPv6)
      addrlen:指定 my_addr 参数所指向的地址结构体的大小,以字节为单位。这是必需的参数,因为 my_addr 结构体的类型可能不同,所以需要确切的大小信息
返回值:
  	  成功: 0
  	  失败: -1并设置全局变量 errno 以指示错误类型。通常的错误有
            EADDRINUSE:指定的地址已经在使用中。
            EBADF:sockfd 不是一个有效的套接字文件描述符。
            EACCES:不具有执行 bind 的权限。
            EADDRNOTAVAIL:指定的地址在当前网络配置下不可用。
            EINVAL:指向无效的 sockaddr 地址

7.recvfrom

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
功能:接收网络发送的数据信息
参数:
		sockfd:套接字文件描述符。通常是通过 socket() 创建的
		buf:指向存储接收到数据的缓冲区的指针
		len:缓冲区的大小,以字节为单位。它指定 buf 缓冲区的最大接收数据量
		flags:用于指定接收操作的选项。常用的标志有
               0:默认操作。
               MSG_PEEK:从队列中读取数据但不移除。
               MSG_WAITALL:等待接收到指定数量的数据     
        src_addr:指向 sockaddr 结构体的指针,用于存储数据来源的地址信息。如果不需要获取源地址,可以传递 NULL
        addrlen:指向 socklen_t 类型的变量的指针,用于传递和接收地址结构体的大小。传入时指定地址结构体的大小,返回时将实际接收到的地址结构体大小存储在该变量中

网络字节序:大端
主机字节序:小端

网络抓包
工具:wireshark
1.抓取通过网卡的数据
2.网络数据调试和分析

TCP协议

1.建立连接 —>三次握手
在这里插入图片描述
2.断开连接------>四次挥手
在这里插入图片描述

TCP编程

客户端
在这里插入图片描述

1.socket

2.connect

 int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
功能:发送三次握手链接请求
参数:
	1.sockfd:套接字文件描述符
	2.addr:存放目的地址空间首地址
	3.addrlen:目的地址长度
返回值:
	成功返回0 
	失败返回-1

3.send

ssize_t send(int sockfd, const void *buf, size_t len, int flags);
功能:
	发送数据
参数:
	1.sockfd:套接字文件描述符
	2.buf:存放数据空间首地址
	3.len:数据长度
	4.flag:属性默认为0 
返回值:
	成功返回发送字节数
	失败返回-1 

recv

ssize_t recv(int sockfd, void *buf, size_t len, int flags);
功能:
	接收数据 
参数:
	1.sockfd:套接字文件描述符
	2.buf:存放数据空间首地址 
	3.len:最多接收数据长度 
	4.flags:接收属性默认为0 
返回值:
	成功返回实际接收字节数
	失败返回-1 
	连接断开,recv不再阻塞,返回0 

close

服务端

socket

bind

listen

int listen(int sockfd, int backlog);
功能:
	监听三次握手链接请求
参数:
	sockfd:套接字文件描述符
	backlog:最多允许等待尚未处理的三次握手链接个数
返回值:
	成功返回0 
	失败返回-1 

accept

recv

send

close

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值