网络通信
OSI七层通信协议模型
- 物理层 电线、光纤
- 数据链路层 网关、ARP、Mac地址 帧
- 网络层 IP传输 数据包
- 传输层 TCP UDP
- 会话层
- 表示层
- 应用层
传输层
表示层和会话层的功能是什么
- 表示层,对数据的表示,编解码 (图像,视频,数据编解码)
- 会话层: 建立会话, 如session认证,断点续传
描述TCP的头部
源端口号(16bit) 和 目的端口号(16bit)
序号(32bit): 字节流的字节编号,用于解决网络传输的乱序的问题;
- 确认号 (32bit) : 接收方给发送方确认报文的编号,其值是收到的序号+1;
- 首部长(4bit): 标识首部的长度为多少个4字节
- 标志位(6bit):
- URG:是否紧急
- ACK:确认报文段
- PSH: 提示接收方理解从缓存中读取数据
- RST: 复位报文段
- SYN:表示请求建立一个连接
- FIN:表示请求中断连接
- 窗口(16bit):接受窗口,告知对方(发送方)本方还有多少空间可以接受数据。用于流量控制
- 校验和(16bit): 检查报文段是否有损坏
TCP socket交互流程
服务器:
创建socket, int socket(int domain, int type,int protool)
绑定socket和端口号, int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
1
2
3
4
5
6
7
8
9// IPv4的sockaddr地址结构
struct sockaddr_in {
sa_family_t sin_family; // 协议类型,AF_INET
in_port_t sin_port; // 端口号
struct in_addr sin_addr; // IP地址
};
struct in_addr {
uint32_t s_addr;
}addrlen:地址长度。
监听端口号 -> int listen(int sockfd, int backlog);
- 要监听的sock描述字
- 可以排队的最大连接数
接收用户请求 -> int accept(int sockfd, struct sockaddr addr, socklen_t addrlen);
IO的分类和实现方式
同步、异步、轮询和回调的不同之处
本质:进程间的通信的方式
信号量
不同的信号在通信的时候,需要指定信号的通信方式,需要是同步还是一部的—linux的通信方式的复习
- 同步:同步及单次的写入不完成就不返回,进程阻塞在单次的请求中,不去做其他的事情
- 异步:异步,当前进程被阻塞时,先返回,请求的结构暂时不返回。
- 轮询:异步请求返回的结果通知有很多的方式,一种是通知的方式,这样当前需要不算的轮询返回的结果,这样相当于需要不断的轮询是否有通知到达
- 回调:异步返回的结果,通过直接告知的方式,底层可以通过信号量的方式进行实现,这样当前进程不需要不断轮询单次请求是否有结果返回。效率更高。
TCP通信在底层发生了什么?
建立连接后内核发生了什么?
当建立socket连接的时候,内核省成本了两条队列:一条用了装正在请求的客户端请求;一条用来装已经建立了连接的请求
系统文件中哪里有sockets相关的信息
/proc/<pid>/net/tcp
目前已经激活的饿TCP连接/proc/<pid>/fd
被程序打开的文件描述符列表/proc/<pid>/net/sockstat 当前TCP连接的概述信息
当socket连接被请求时,会发生什么?
- socket struct 的结构以及它对于套接字的意义
- 内核是怎么和IO的端口文件结合起来的,
- 在做IO的TCP的协议的具体过程是哪些方法在哪里实现的 (内核的实现)
HTTP
协议细节