0
点赞
收藏
分享

微信扫一扫

积分因子(恰当微分方程续)

火热如冰 2024-09-11 阅读 18
网络

文章目录

一、初始协议

1、理解

2、协议分层

3、软件分层

4、OSI七层模型

5、TCP/IP五层模型

二、再识协议

1、为什么要有TCP/IP协议

2、什么是TCP/IP协议

3、TCP/IP协议与操作系统的关系(宏观上,怎么实现的)

三、网络传输基本流程

1、mac地址

2、TCP/IP协议通信的过程

  • 报文 = 报头 + 有效载荷。—> 栈结构
  • 数据在网络中发送的时候,一定最终要在硬件上跑。

网络协议的共性:

image-20240910104239761

3、认识IP地址

IP地址 vs Mac地址

image-20240910105306585

网络通信的宏观路径

image-20240910105452372

四、Socket编程

1、理解IP和Mac

2、端口号Port

进程已经有了唯一标识的Pid,为什么还要用端口号来进行唯一标识进程呢?

为了保证系统和网络进行解耦!当底层pid部分发生更改了,也不影响网络通信。

进程都有pid,但是不是所有的进程都需要网络通信,只有需要网络通信的进程才会有端口号。

3、传输层代表

image-20240910110616833

(1)、认识TCP协议

(2)、认识UDP协议

4、网络字节序

#include <arpa/inet.h>
// h--->host:本主机
// n--->net:网络
uint32_t htonl(uint32_t hostlong); // 将hostlong的32位无符号整数转化为网络字节序
uint32_t ntohl(uint32_t netlong); // 将netlong的32位无符号整数转化为主机字节序
uint16_t htons(uint16_t hostshort); // 将hostshort的16位无符号整数转化为网络字节序
uint16_t ntohs(uint16_t netshort); // 将netshort的16位无符号整数转化为主机字节序

5、socket编程接口

(1)Udp

创建套接字socket
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);

image-20240910112445994

绑定端口bind
#include <sys/types.h>
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr,
 socklen_t addrlen);
// 返回值:成功返回0, 失败返回-1,设置errno
---------------------------------------------
#include <netinet/in.h>

struct sockaddr_in {
    sa_family_t    sin_family; // 地址族,通常是 AF_INET
    uint16_t       sin_port;   // 端口号
    struct in_addr sin_addr;   // IP 地址
};

struct in_addr {
    uint32_t s_addr; // IP 地址
};

// 填充sockaddr
struct sockaddr_in local;
memset(&local, 0, sizeof(local));//先置空
local.sin_family = AF_INET;
local.sin_port = htos(_localport);
//local.sin_addr.s_addr = inet_addr(_localip.c_str())// 需要4字节IP,需要网络序列的IP,不建议
inet_pton(AF_INET, _localip.c_str(), &local.in_addr); // 建议
// 将字符串IP地址转化为网络字节序
int inet_pton(int af, const char *src, void *dst); 
in_addr_t inet_addr(const char *cp);
// 将网络字节序IP地址转化成字符串
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
char *inet_ntoa(struct in_addr in);

image-20240910113941308

接收消息recvfrom
#include <sys/types.h>
#include <sys/socket.h>

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);

image-20240910114013544

发送消息sendto
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);

image-20240910114057772

(2)Tcp

socket,bind和Udp同理。

开始监听 socket (TCP, 服务器)listen
#include <sys/types.h>
#include <sys/socket.h>
int listen(int socket, int backlog);
// 这个backlog我设置为8
// 成功返回0,失败返回-1且错误码被设置

image-20240910114533765

接收请求 (TCP, 服务器)accept
#include <sys/types.h> 
#include <sys/socket.h>
int accept(int socket, struct sockaddr* address, socklen_t* address_len);

image-20240910115312062

建立连接 (TCP, 客户端)connet
#include <sys/types.h>
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

image-20240910115417388

(3)socketaddr结构

image-20240910115548452

谢谢大家!

举报

相关推荐

0 条评论