套接字编程
套接字的本质就是一个有相应描述符的打开文件 地址存放在16个字节的结构体中,2字节协议族,2字节端口,4字节IP地址,8字节空对齐
通用套接字结构:2字节协议族,14字节的地址数据 最后设计 accept ,bind,connect 的时候都要求使用通用套接字结构
socket 函数用来创建一个套接字描述符,但此时还不能打开 connect 会阻塞,直到连接成功或发生错误
网络字节序(大端模式): 高字节放低地址,低字节放高地址 比如传输一个 4 字节的整型,次序是 0~ 7 bit, 8~15 bit
服务端: bind 告诉内核将服务器的套接字地址和套接字描述符 sockfd 联系起来 listen 用于区别服务端和客户端,将 sockfd 转成一个监听套接字 listenfd accept 客户端连接到达服务端,将 addr 填入客户端套接字地址,返回已连接的描述符,并使用 unix RIO 来进行读写,已连接描述符每次 accept 都要创建一次 已连接描述符会返回给客户,客户从 connect 返回
客户与服务端通过分别读写:clientfd 和 connfd 来回传送数据
通过 getaddrinfo 和 getnameinfo 来抽象不同版本的 IP 协议 客户端只要调用了 close 后,服务端就会读到 EOF,也会相应 close,本次服务结束

为套接字开启异步IO
如果套接字是非阻塞的模式下,errno会被设置成 EWOULDBLOCK 或者 EAGAIN,需要用 poll 或 select 来判断能否接受或传输数据
CGI-Bin
通过 URL 的路径调用客户端目录中的可执行文件 通过 fork 创建子进程,execve 路径中的子程序,服务器通过环境变量传递参数给子进程,子进程输出到标准输出流,在此之前通过重定向将标准输出重定向到已连接描述符即可
HTTP
请求的结构: 一个请求行,| method | URI | version 多个请求报头,结束报头的空行
请求的结构类似 一个响应行 | version | status code | status message 响应报头+空行 响应主体
网络安全
SYN Flood 攻击
利用三次握手发送第一次 SYN 包但是又不回复 ACK,使得服务端需要维护大量的半连接同时消耗大量的CPU时间以及内存导致堆栈溢出
解决方法:
- 缩短 SYN timeout 时间
- SYN cookie 标识 IP,收到来自该IP大量重复包则丢弃
- DNS层的负载均衡