文章目录
一、初始协议
1、理解
2、协议分层
3、软件分层
4、OSI七层模型
5、TCP/IP五层模型
二、再识协议
1、为什么要有TCP/IP协议
2、什么是TCP/IP协议
3、TCP/IP协议与操作系统的关系(宏观上,怎么实现的)
三、网络传输基本流程
1、mac地址
2、TCP/IP协议通信的过程
- 报文 = 报头 + 有效载荷。—> 栈结构
- 数据在网络中发送的时候,一定最终要在硬件上跑。
网络协议的共性:
3、认识IP地址
IP地址 vs Mac地址
网络通信的宏观路径
四、Socket编程
1、理解IP和Mac
2、端口号Port
进程已经有了唯一标识的Pid,为什么还要用端口号来进行唯一标识进程呢?
为了保证系统和网络进行解耦!当底层pid部分发生更改了,也不影响网络通信。
进程都有pid,但是不是所有的进程都需要网络通信,只有需要网络通信的进程才会有端口号。
3、传输层代表
(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);
绑定端口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);
接收消息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);
发送消息sendto
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
(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且错误码被设置
接收请求 (TCP, 服务器)accept
#include <sys/types.h>
#include <sys/socket.h>
int accept(int socket, struct sockaddr* address, socklen_t* address_len);
建立连接 (TCP, 客户端)connet
#include <sys/types.h>
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
(3)socketaddr结构
谢谢大家!