个人知识库 个人知识库
首页
关于
  • C语言
  • CPlusPlus
  • Linux
  • PHP
  • Nginx
  • MySQL
  • Redis
  • Docker
  • Kubernetes
  • SRS
阅读
常用工具
  • 分类
  • 标签
  • 归档
GitHub

Agnes001

坚持是一件很伟大的事业
首页
关于
  • C语言
  • CPlusPlus
  • Linux
  • PHP
  • Nginx
  • MySQL
  • Redis
  • Docker
  • Kubernetes
  • SRS
阅读
常用工具
  • 分类
  • 标签
  • 归档
GitHub
  • C语言

  • CPlusPlus

  • Lua技术栈

  • edoyun

  • 内存管理

  • 数据结构

  • 网络编程

    • 网络基础
      • 分层模型与协议格式
      • socket编程
        • 套接字
        • 网络字节序
        • sockaddr 数据结构
      • 网路套接字函数
        • socket函数
        • bind函数
        • listen函数
        • accept函数
        • connect函数
      • TCP三次握手建立连接
      • MTU、mss、半关闭
      • 错误处理
      • 并发服务器模型
    • 基于TCP和UDP通信的服务端和客户端
    • 结构化网络消息
  • Linux

  • 池化技术

  • 操作系统

  • python

  • 编程技术
  • 网络编程
Agnes001
2022-02-28

网络基础

参考资料: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 一般思想

# 并发服务器模型

多进程并发 多线程并发

编辑此页
算法
基于TCP和UDP通信的服务端和客户端

← 算法 基于TCP和UDP通信的服务端和客户端 →

Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式