网络基础
参考资料:https://www.taodocs.com/p-285094830.html 路由器:路由表和NAT映射表
- 路由表 > 路由表中含有网络周边的拓扑信息。路由表建立的主要目标是为了实现路由协议和静态路由选择。
- NAT映射表 > 内网IP对应的公网IP
打洞是服务器参与的 一般情况下:一个客户端到服务器 服务器到另一个客户端 路由器默认的保护机制,对于陌生IP第一次发送数据包,会把数据包屏蔽或丢弃;
TCP协议注重数据的传输。http协议着重于数据的解释。
# 分层模型与协议格式
应用层
传输层
网络层
数据链路层 --以太网协议
以太网的最大传输单元(MTU)的最大值为1500,数据包大于拨号链路的MTU,则需要对数据包进行分片。
# socket编程
# 套接字
套接字有两端,数据发送端和数据接收端
IP地址:在网络环境中唯一标识一台主机 端口号:在主机中唯一标识一个进程 IP+Port:在网络环境中唯一标识一个进程(socket)
Linux文件的类型: 占用空间的:普通文件、目录、软连接 不占用空间的:字符文件、块文件、管道文件、套接字
管道有两端,分别为写入和读取,fd[1]和fd[0],半双工
套接字fd有两块缓冲区(读和写),全双工
# 网络字节序
大端:低存高,高存低 低地址存高位 小端:低存低,高存高
TCP/IP协议规定,网络数据流采用大端字节序
int a = 0x12345678; 大 小 1003 78 12 1002 56 34 1001 34 56 1000 12 78
网络字节序和主机字节序的转换函数
#include <arpa/inet.h>
//h表示host, n表示network, l表示32位长整数, s表示16位短整数
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
IP地址转换函数
#include <arpa/inet.h>
//af AF_INET/AF_INET6
int inet_pton(int af, const char* src, void* dst);
const char* inet_ntop(int af, const void char* src, char* dst, socklen_t size);
# sockaddr 数据结构
#include <netinet/in.h> struct sockaddr是最早定义的,函数中亦使用此类型 struct sockaddr_in是衍生出来的,定义时使用此类型,sin_family,sin_port,sin_sddr.s_addr
# 网路套接字函数
unistd.h 包含了许多系统服务的函数原型,例如read函数、write函数和getpid函数等。
# socket函数
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
# bind函数
服务器程序所监听的网络地址和端口号通常时不变的,客户端得知服务器程序的地址和端口号后就可以向服务器发起连接,因此服务器需要调用bind绑定一个固定的网络地址和端口号。
#include <sys/types.h>
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr* addr, socklen_t addrlen);
//bind的作用是将参数sockfd和addr绑定在一起,使sockfd这个用于网络通讯的文件描述符监听addr所描述的地址和端口号。
# listen函数
#include <sys/types.h>
#include <sys/socket.h>
int listen(int sockfd, int backlog);
//listen指定监听上限数,同时允许多少个客户端跟我建立连接
# accept函数
#include <sys/types.h>
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr* addr, socklen_t* addrlen);
# connect函数
#include <sys/types.h>
#include <sys/socket.h>
int connect(int sockfd, struct sockaddr* addr, socklen_t* addrlen);
make gcc server.c -o server -Wall -g
-I目录 指定头文件目录 -c 只编译,生成.o文件,不进行链接 -g 包含调试信息 -On n=0∼3 编译优化,n越大优化得越多 -Wall 提示更多警告信息 -D DEF 编译时定义宏 -E 生成预处理文件 -M 生成.c文件与头文件依赖关系以用于Makefile,包括系统库的头文件 -MM 生成.c文件与头文件依赖关系以用于Makefile,不包括系统库的头文件
make clean 测试 nc 127.0.0.1 6666 脑残命令 哈哈 ldd
# TCP三次握手建立连接
# MTU、mss、半关闭
# 错误处理
readn readline 一般思想
# 并发服务器模型
多进程并发 多线程并发