网络是如何请求的(第二章(上)|网络是如何请求的:第二章(上) 一条TCP连接的生命周期)
用电信号传输 TCP/IP 数据 全书基于一个简单场景:用户向浏览器输入一条URL到响应返回,一条网络请求的生命周期。
文章图片
全书共分六合部分:
- 应用层客户端生成HTTP,委托给操作系统的协议栈
- 协议栈(TCP/IP模块)调用网卡驱动生成电信号
- 网卡如何通过路由器到达用于接入互联网的路由器
- 互联网内部接力传输
- 到达web服务器之后先通过防火墙的检查
- web服务器是如何收取数据的
- 创建套接字
- 连接服务器
- 收发数据
- 从服务器断开连接并删除套接字
- IP与以太网的包收发操作
- 用UDP收发数据的操作
文章图片
如上图所示,本文介绍 1 至 4,对应 TCP 模块的整个生命周期。
【网络是如何请求的(第二章(上)|网络是如何请求的:第二章(上) 一条TCP连接的生命周期)】主要看点如下:
- 协议栈的内部结构
- 套接字的实体是什么?有什么工具能直接观察到吗?
- “连接”的过程中发生了什么?三次握手
- 收发数据时的具体工作流程。
- “断开”的过程中发生了什么?四次挥手
0.1 协议栈的内部结构
文章图片
所谓协议栈分成上下两部分,
- 接收应用程序委托收发数据的TCP UDP模块。
- 控制网络包发送的IP模块,IP模块包含ICMP协议和ARP协议
- 网卡驱动负责控制网卡硬件,用于监听发送网线中的光电信号
浏览器,邮件等一般应用程序一般用TCP
DNS查询等收发较短的控制数据一般用UDP
0.2 套接字的实体
先用 netstat 直观的感受一下
文章图片
套接字:协议栈中用于存放控制信息的内存空间
控制信息:协议类型 ip地址 端口号 状态...
套接字中记录了通信双方的信息以及通信所处的状态,
而协议栈是根据套接字中的控制信息来工作的
1. 创建套接字
int socket(int af, int type, int protocol);
af:地址族,即IP地址类型,常用的有 AF_INET 和 AF_INET6
AF_INET 代表 IPv4,例如 127.0.0.1
AF_INET6 代表 IPv6,例如 1030::C9B4:FF12:48AA:1A2B
type:数据传输方式/套接字类型,常用的有 SOCK_STREAM,SOCK_STREAM
SOCK_STREAM 流格式套接字/面向连接的套接字
SOCK_DGRAM 数据报套接字/无连接的套接字
protocol:传输协议,常用的有 IPPROTO_TCP 和 IPPTOTO_UDP
IPPROTO_TCP:TCP 传输协议
IPPTOTO_UDP:UDP 传输协议
返回值:描述符
详见 socket()函数详解,介绍了 linux windows 两种版本
创建套接字的工作流程
- 向内存管理器申请一块内存 --> malloc()
- 初始化控制信息(协议类型 ip地址 端口)
- 返回描述符给应用程序,用于唯一标识套接字(控制信息),后续通信应用程序与协议栈交互会带上描述符。
2. 连接服务器 连接是什么
负责保存控制信息的头部
连接操作的实际过程 -- TCP 的三次握手
推荐阅读
- 热闹中的孤独
- 我要做大厨
- parallels|parallels desktop 解决网络初始化失败问题
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量
- 爱就是希望你好好活着
- 太平之莲
- 知识
- 猎杀IP
- 叙述作文
- 时间老了