用电信号传输 TCP/IP 数据
全书基于一个简略场景:用户向浏览器输出一条 URL 到响应返回,一条网络申请的生命周期。
全书共分六合局部:
- 应用层客户端生成 HTTP,委托给操作系统的协定栈
- 协定栈(TCP/IP 模块)调用网卡驱动生成电信号
- 网卡如何通过路由器达到用于接入互联网的路由器
- 互联网外部接力传输
- 达到 web 服务器之后先通过防火墙的查看
- web 服务器是如何收取数据的
第二章次要介绍,操作系统中的协定栈和网卡是如何将应用程序的音讯发给服务器的:
- 创立套接字
- 连贯服务器
- 收发数据
- 从服务器断开连接并删除套接字
- IP 与以太网的包收发操作
- 用 UDP 收发数据的操作
如上图所示,本文介绍 1 至 4,对应 TCP 模块的整个生命周期。
次要看点如下:
- 协定栈的内部结构
- 套接字的实体是什么?有什么工具能间接察看到吗?
- “连贯”的过程中产生了什么?三次握手
- 收发数据时的具体工作流程。
- “断开”的过程中产生了什么?四次挥手
0. 概述
开始摸索之前作者先梳理了几个概念
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. 连贯服务器
连贯是什么
int connect(int sock, struct sockaddr *serv_addr, socklen_t addrlen);
sock 套接字文件描述符
serv_addr 地址族 ip port
addrlen serv_addr 大小
以太网的网线始终处于连通状态,无需连贯。
连贯理论是通信单方替换管制信息。
连贯时做了什么:
- 应用程序将服务端 ip port 交给协定栈
- 协定栈发动开始通信的申请
- 交互管制信息
- 开拓收发数据的缓冲区
负责保留管制信息的头部
通信操作中的管制信息分两类:
- 客户端与服务器相互联系时替换的管制信息。即各类协定的头部,TCP、IP、MAC。头部用于记录和替换管制信息
- 保留于套接字中,用于控制协议栈操作的信息。从应用程序传递来的信息以及从通信对象接管到的信息。
对于套接字中的管制信息,不同协定栈有不同实现,只有通信时按规定生成协定头部即可。
TCP 头部信息:
管制信息:
通信操作中的管制信息分两类:1. 头部中记录的信息
2. 套接字(协定栈中的内存空间)中记录的信息
可用 netstat 查看套接字
应用 wireshark(windows)或 tcpdump(linux)查看协定头
—– 未完待续
连贯操作的理论过程
TCP 的三次握手
以 TCP 举例连贯操作的理论过程,先来看一下三次握手。