网络是如何请求的(第二章(上)|网络是如何请求的:第二章(上) 一条TCP连接的生命周期)

用电信号传输 TCP/IP 数据 全书基于一个简单场景:用户向浏览器输入一条URL到响应返回,一条网络请求的生命周期。
网络是如何请求的(第二章(上)|网络是如何请求的:第二章(上) 一条TCP连接的生命周期)
文章图片

全书共分六合部分:

  1. 应用层客户端生成HTTP,委托给操作系统的协议栈
  2. 协议栈(TCP/IP模块)调用网卡驱动生成电信号
  3. 网卡如何通过路由器到达用于接入互联网的路由器
  4. 互联网内部接力传输
  5. 到达web服务器之后先通过防火墙的检查
  6. web服务器是如何收取数据的
第二章主要介绍,操作系统中的协议栈和网卡是如何将应用程序的消息发给服务器的:
  1. 创建套接字
  2. 连接服务器
  3. 收发数据
  4. 从服务器断开连接并删除套接字
  5. IP与以太网的包收发操作
  6. 用UDP收发数据的操作
网络是如何请求的(第二章(上)|网络是如何请求的:第二章(上) 一条TCP连接的生命周期)
文章图片

如上图所示,本文介绍 1 至 4,对应 TCP 模块的整个生命周期。
【网络是如何请求的(第二章(上)|网络是如何请求的:第二章(上) 一条TCP连接的生命周期)】主要看点如下:
  1. 协议栈的内部结构
  2. 套接字的实体是什么?有什么工具能直接观察到吗?
  3. “连接”的过程中发生了什么?三次握手
  4. 收发数据时的具体工作流程。
  5. “断开”的过程中发生了什么?四次挥手
0. 概述 开始探索之前作者先梳理了几个概念
0.1 协议栈的内部结构
网络是如何请求的(第二章(上)|网络是如何请求的:第二章(上) 一条TCP连接的生命周期)
文章图片

所谓协议栈分成上下两部分,
  1. 接收应用程序委托收发数据的TCP UDP模块。
  2. 控制网络包发送的IP模块,IP模块包含ICMP协议和ARP协议
  3. 网卡驱动负责控制网卡硬件,用于监听发送网线中的光电信号
浏览器,邮件等一般应用程序一般用TCP DNS查询等收发较短的控制数据一般用UDP

0.2 套接字的实体
先用 netstat 直观的感受一下
网络是如何请求的(第二章(上)|网络是如何请求的:第二章(上) 一条TCP连接的生命周期)
文章图片

套接字:协议栈中用于存放控制信息的内存空间
控制信息:协议类型 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 两种版本
创建套接字的工作流程
  1. 向内存管理器申请一块内存 --> malloc()
  2. 初始化控制信息(协议类型 ip地址 端口)
  3. 返回描述符给应用程序,用于唯一标识套接字(控制信息),后续通信应用程序与协议栈交互会带上描述符。
----- 未完待续
2. 连接服务器 连接是什么
负责保存控制信息的头部
连接操作的实际过程 -- TCP 的三次握手

    推荐阅读