用电信号传输 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. 创立套接字
<code class="java">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举例连贯操作的理论过程,先来看一下三次握手。