用电信号传输 TCP/IP 数据


全书基于一个简略场景:用户向浏览器输出一条URL到响应返回,一条网络申请的生命周期。

全书共分六合局部:

  1. 应用层客户端生成HTTP,委托给操作系统的协定栈
  2. 协定栈(TCP/IP模块)调用网卡驱动生成电信号
  3. 网卡如何通过路由器达到用于接入互联网的路由器
  4. 互联网外部接力传输
  5. 达到web服务器之后先通过防火墙的查看
  6. web服务器是如何收取数据的

第二章次要介绍,操作系统中的协定栈和网卡是如何将应用程序的音讯发给服务器的:

  1. 创立套接字
  2. 连贯服务器
  3. 收发数据
  4. 从服务器断开连接并删除套接字
  5. IP与以太网的包收发操作
  6. 用UDP收发数据的操作


如上图所示,本文介绍 1 至 4,对应 TCP 模块的整个生命周期。

次要看点如下:

  1. 协定栈的内部结构
  2. 套接字的实体是什么?有什么工具能间接察看到吗?
  3. “连贯”的过程中产生了什么?三次握手
  4. 收发数据时的具体工作流程。
  5. “断开”的过程中产生了什么?四次挥手

0. 概述

开始摸索之前作者先梳理了几个概念

0.1 协定栈的内部结构

所谓协定栈分成高低两局部,

  1. 接管应用程序委托收发数据的TCP UDP模块。
  2. 管制网络包发送的IP模块,IP模块蕴含ICMP协定和ARP协定
  3. 网卡驱动负责管制网卡硬件,用于监听发送网线中的光电信号
浏览器,邮件等个别应用程序个别用TCPDNS查问等收发较短的控制数据个别用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:1A2Btype:数据传输方式/套接字类型,罕用的有 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. 连贯服务器

连贯是什么

int connect(int sock, struct sockaddr *serv_addr, socklen_t addrlen);sock        套接字文件描述符serv_addr    地址族 ip portaddrlen        serv_addr 大小

以太网的网线始终处于连通状态,无需连贯。
连贯理论是通信单方替换管制信息。

连贯时做了什么:

  1. 应用程序将服务端ip port交给协定栈
  2. 协定栈发动开始通信的申请
  3. 交互管制信息
  4. 开拓收发数据的缓冲区

负责保留管制信息的头部

通信操作中的管制信息分两类:

  1. 客户端与服务器相互联系时替换的管制信息。即各类协定的头部,TCP、IP、MAC。头部用于记录和替换管制信息
  2. 保留于套接字中,用于控制协议栈操作的信息。从应用程序传递来的信息以及从通信对象接管到的信息。

对于套接字中的管制信息,不同协定栈有不同实现,只有通信时按规定生成协定头部即可。

TCP头部信息:

管制信息:

通信操作中的管制信息分两类:1. 头部中记录的信息2. 套接字(协定栈中的内存空间)中记录的信息

可用netstat查看套接字
应用 wireshark(windows) 或 tcpdump(linux) 查看协定头

----- 未完待续

连贯操作的理论过程

TCP 的三次握手

以TCP举例连贯操作的理论过程,先来看一下三次握手。

TCP 连贯操作的理论过程