TCPIP详解卷1:协议的作品目录

TCPIP详解卷1:协议的作品目录,第1张

译者序

前言

第1章 概述1

1.1 引言1

1.2 分层1

1.3 TCP/IP的分层4

1.4 互联网的地址5

1.5 域名系统6

1.6 封装6

1.7 分用8

1.8 客户-服务器模型8

1.9 端口号9

1.10 标准化过程10

1.11 RFC10

1.12 标准的简单服务11

1.13 互联网12

1.14 实现12

1.15 应用编程接口12

1.16 测试网络13

1.17 小结13

第2章 链路层15

2.1 引言15

2.2 以太网和IEEE 802封装15

2.3 尾部封装17

2.4 SLIP:串行线路IP17

2.5 压缩的SLIP18

2.6 PPP:点对点协议18

2.7 环回接口20

2.8 最大传输单元MTU21

2.9 路径MTU21

2.10 串行线路吞吐量计算21

2.11 小结22

第3章 IP:网际协议24

3.1 引言24

3.2 IP首部24

3.3 IP路由选择27

3.4 子网寻址30

3.5 子网掩码32

3.6 特殊情况的IP地址33

3.7 一个子网的例子33

3.8 ifconfig命令35

3.9 netstat命令36

3.10 IP的未来36

3.11 小结37

第4章 ARP:地址解析协议38

4.1 引言38

4.2 一个例子38

4.3 ARP高速缓存40

4.4 ARP的分组格式40

4.5 ARP举例41

4.5.1 一般的例子41

4.5.2 对不存在主机的ARP请求42

4.5.3 ARP高速缓存超时设置43

4.6 ARP代理43

4.7 免费ARP45

4.8 arp命令45

4.9 小结46

第5章 RARP:逆地址解析协议47

5.1 引言47

5.2 RARP的分组格式47

5.3 RARP举例47

5.4 RARP服务器的设计48

5.4.1 作为用户进程的RARP服务器49

5.4.2 每个网络有多个RARP服务器49

5.5 小结49

第6章 ICMP:Internet控制报文协议50

6.1 引言50

6.2 ICMP报文的类型50

6.3 ICMP地址掩码请求与应答52

6.4 ICMP时间戳请求与应答53

6.4.1 举例54

6.4.2 另一种方法55

6.5 ICMP端口不可达差错56

6.6 ICMP报文的4.4BSD处理59

6.7 小结60

第7章 Ping程序61

7.1 引言61

7.2 Ping程序61

7.2.1 LAN输出62

7.2.2 WAN输出63

7.2.3 线路SLIP链接64

7.2.4 拨号SLIP链路65

7.3 IP记录路由选项65

7.3.1 通常的例子66

7.3.2 异常的输出68

7.4 IP时间戳选项69

7.5 小结70

第8章 Traceroute程序71

8.1 引言71

8.2 Traceroute 程序的操作71

8.3 局域网输出72

8.4 广域网输出75

8.5 IP源站选路选项76

8.5.1 宽松的源站选路的traceroute

程序示例78

8.5.2 严格的源站选路的traceroute

程序示例79

8.5.3 宽松的源站选路traceroute程序

的往返路由80

8.6 小结81

第9章 IP选路83

9.1 引言83

9.2 选路的原理84

9.2.1 简单路由表84

9.2.2 初始化路由表86

9.2.3 较复杂的路由表87

9.2.4 没有到达目的地的路由87

9.3 ICMP主机与网络不可达差错88

9.4 转发或不转发89

9.5 ICMP重定向差错89

9.5.1 一个例子90

9.5.2 更多的细节91

9.6 ICMP路由器发现报文92

9.6.1 路由器操作93

9.6.2 主机操作93

9.6.3 实现93

9.7 小结94

第10章 动态选路协议95

10.1 引言95

10.2 动态选路95

10.3 Unix选路守护程序96

10.4 RIP:选路信息协议96

10.4.1 报文格式96

10.4.2 正常运行97

10.4.3 度量98

10.4.4 问题98

10.4.5 举例98

10.4.6 另一个例子100

10.5 RIP版本2102

10.6 OSPF:开放最短路径优先102

10.7 BGP:边界网关协议103

10.8 CIDR:无类型域间选路104

10.9 小结105

第11章 UDP:用户数据报协议107

11.1 引言107

11.2 UDP首部107

11.3 UDP检验和108

11.3.1 tcpdump输出109

11.3.2 一些统计结果109

11.4 一个简单的例子110

11.5 IP分片111

11.6 ICMP不可达差错(需要分片)113

11.7 用Traceroute确定路径MTU114

11.8 采用UDP的路径MTU发现116

11.9 UDP和ARP之间的交互作用118

11.10 最大UDP数据报长度119

11.11 ICMP源站抑制差错120

11.12 UDP服务器的设计122

11.12.1 客户IP地址及端口号122

11.12.2 目标IP地址122

11.12.3 UDP输入队列122

11.12.4 限制本地IP地址124

11.12.5 限制远端IP地址125

11.12.6 每个端口有多个接收者125

11.13 小结126

第12章 广播和多播128

12.1 引言128

12.2 广播129

12.2.1 受限的广播129

12.2.2 指向网络的广播129

12.2.3 指向子网的广播129

12.2.4 指向所有子网的广播130

12.3 广播的例子130

12.4 多播132

12.4.1 多播组地址133

12.4.2 多播组地址到以太网地址的转换133

12.4.3 FDDI和令牌环网络中的多播134

12.5 小结134

第13章 IGMP:Internet组管理协议136

13.1 引言136

13.2 IGMP报文136

13.3 IGMP协议136

13.3.1 加入一个多播组136

13.3.2 IGMP报告和查询137

13.3.3 实现细节137

13.3.4 生存时间字段138

13.3.5 所有主机组138

13.4 一个例子138

13.5 小结141

第14章 DNS:域名系统142

14.1 引言142

14.2 DNS基础142

14.3 DNS的报文格式144

14.3.1 DNS查询报文中的问题部分146

14.3.2 DNS响应报文中的资源记录部分147

14.4 一个简单的例子147

14.5 指针查询150

14.5.1 举例151

14.5.2 主机名检查151

14.6 资源记录152

14.7 高速缓存153

14.8 用UDP还是用TCP156

14.9 另一个例子156

14.10 小结157

第15章 TFTP:简单文件传送协议159

15.1 引言159

15.2 协议159

15.3 一个例子160

15.4 安全性161

15.5 小结162

第16章 BOOTP: 引导程序协议163

16.1 引言163

16.2 BOOTP的分组格式163

16.3 一个例子164

16.4 BOOTP服务器的设计165

16.5 BOOTP穿越路由器167

16.6 特定厂商信息167

16.7 小结168

第17章 TCP:传输控制协议170

17.1 引言170

17.2 TCP的服务170

17.3 TCP的首部171

17.4 小结173

第18章 TCP连接的建立与终止174

18.1 引言174

18.2 连接的建立与终止174

18.2.1 tcpdump的输出174

18.2.2 时间系列175

18.2.3 建立连接协议175

18.2.4 连接终止协议177

18.2.5 正常的tcpdump输出177

18.3 连接建立的超时178

18.3.1 第一次超时时间178

18.3.2 服务类型字段179

18.4 最大报文段长度179

18.5 TCP的半关闭180

18.6 TCP的状态变迁图182

18.6.1 2MSL等待状态183

18.6.2 平静时间的概念186

18.6.3 FIN_WAIT_2状态186

18.7 复位报文段186

18.7.1 到不存在的端口的连接请求187

18.7.2 异常终止一个连接187

18.7.3 检测半打开连接188

18.8 同时打开189

18.9 同时关闭191

18.10 TCP选项191

18.11 TCP服务器的设计192

18.11.1 TCP服务器端口号193

18.11.2 限定的本地IP地址194

18.11.3 限定的远端IP地址195

18.11.4 呼入连接请求队列195

18.12 小结197

第19章 TCP的交互数据流200

19.1 引言200

19.2 交互式输入200

19.3 经受时延的确认201

19.4 Nagle算法203

19.4.1 关闭Nagle算法204

19.4.2 一个例子205

19.5 窗口大小通告207

19.6 小结208

第20章 TCP的成块数据流209

20.1 引言209

20.2 正常数据流209

20.3 滑动窗口212

20.4 窗口大小214

20.5 PUSH标志215

20.6 慢启动216

20.7 成块数据的吞吐量218

20.7.1 带宽时延乘积220

20.7.2 拥塞220

20.8 紧急方式221

20.9 小结224

第21章 TCP的超时与重传226

21.1 引言226

21.2 超时与重传的简单例子226

21.3 往返时间测量227

21.4 往返时间RTT的例子229

21.4.1 往返时间RTT的测量229

21.4.2 RTT估计器的计算231

21.4.3 慢启动233

21.5 拥塞举例233

21.6 拥塞避免算法235

21.7 快速重传与快速恢复算法236

21.8 拥塞举例(续)237

21.9 按每条路由进行度量240

21.10 ICMP的差错240

21.11 重新分组243

21.12 小结243

第22章 TCP的坚持定时器245

22.1 引言245

22.2 一个例子245

22.3 糊涂窗口综合症246

22.4 小结250

第23章 TCP的保活定时器251

23.1 引言251

23.2 描述252

23.3 保活举例253

23.3.1 另一端崩溃253

23.3.2 另一端崩溃并重新启动254

23.3.3 另一端不可达254

23.4 小结255

第24章 TCP的未来和性能256

24.1 引言256

24.2 路径MTU发现256

24.2.1 一个例子257

24.2.2 大分组还是小分组258

24.3 长肥管道259

24.4 窗口扩大选项262

24.5 时间戳选项263

24.6 PAWS:防止回绕的序号265

24.7 T/TCP:为事务用的TCP扩展265

24.8 TCP的性能267

24.9 小结268

第25章 SNMP:简单网络管理协议270

25.1 引言270

25.2 协议270

25.3 管理信息结构272

25.4 对象标识符274

25.5 管理信息库介绍274

25.6 实例标识276

25.6.1 简单变量276

25.6.2 表格276

25.6.3 字典式排序277

25.7 一些简单的例子277

25.7.1 简单变量278

25.7.2 get-next操作278

25.7.3 表格的访问279

25.8 管理信息库(续)279

25.8.1 system组279

25.8.2 interface组280

25.8.3 at组281

25.8.4 ip组282

25.8.5 icmp组285

25.8.6 tcp组285

25.9 其他一些例子288

25.9.1 接口MTU288

25.9.2 路由表288

25.10 trap290

25.11 ASN.1和BER291

25.12 SNMPv2292

25.13 小结292

第26章 Telnet和Rlogin:远程登录293

26.1 引言293

26.2 Rlogin协议294

26.2.1 应用进程的启动295

26.2.2 流量控制295

26.2.3 客户的中断键296

26.2.4 窗口大小的改变296

26.2.5 服务器到客户的命令296

26.2.6 客户到服务器的命令297

26.2.7 客户的转义符298

26.3 Rlogin的例子298

26.3.1 初始的客户-服务器协议298

26.3.2 客户中断键299

26.4 Telnet协议302

26.4.1 NVT ASCII302

26.4.2 Telnet命令302

26.4.3 选项协商303

26.4.4 子选项协商304

26.4.5 半双工、一次一字符、一次

一行或行方式304

26.4.6 同步信号306

26.4.7 客户的转义符306

26.5 Telnet举例306

26.5.1 单字符方式306

26.5.2 行方式310

26.5.3 一次一行方式(准行方式)312

26.5.4 行方式:客户中断键313

26.6 小结314

第27章 FTP:文件传送协议316

27.1 引言316

27.2 FTP协议316

27.2.1 数据表示316

27.2.2 FTP命令318

27.2.3 FTP应答319

27.2.4 连接管理320

27.3 FTP的例子321

27.3.1 连接管理:临时数据端口321

27.3.2 连接管理:默认数据端口323

27.3.3 文本文件传输:NVT ASCII

表示还是图像表示325

27.3.4 异常中止一个文件的传输:

Telnet同步信号326

27.3.5 匿名FTP329

27.3.6 来自一个未知IP地址的匿名FTP330

27.4 小结331

第28章 SMTP:简单邮件传送协议332

28.1 引言332

28.2 SMTP协议332

28.2.1 简单例子332

28.2.2 SMTP命令334

28.2.3 信封、首部和正文335

28.2.4 中继代理335

28.2.5 NVT ASCII337

28.2.6 重试间隔337

28.3 SMTP的例子337

28.3.1 MX记录:主机非直接连到

Internet337

28.3.2 MX记录:主机出故障339

28.3.3 VRFY和EXPN命令340

28.4 SMTP的未来340

28.4.1 信封的变化:扩充的SMTP341

28.4.2 首部变化:非ASCII字符342

28.4.3 正文变化:通用Internet邮件

扩充343

28.5 小结346

第29章 网络文件系统347

29.1 引言347

29.2 Sun远程过程调用347

29.3 XDR:外部数据表示349

29.4 端口映射器349

29.5 NFS协议351

29.5.1 文件句柄353

29.5.2 安装协议353

29.5.3 NFS过程354

29.5.4 UDP还是TCP355

29.5.5 TCP上的NFS355

29.6 NFS实例356

29.6.1 简单的例子:读一个文件356

29.6.2 简单的例子:创建一个目录357

29.6.3 无状态358

29.6.4 例子:服务器崩溃358

29.6.5 等幂过程360

29.7 第3版的NFS360

29.8 小结361

第30章 其他的TCP/IP应用程序363

30.1 引言363

30.2 Finger协议363

30.3 Whois协议364

30.4 Archie、WAIS、Gopher、Veronica

和WWW366

30.4.1 Archie366

30.4.2 WAIS366

30.4.3 Gopher366

30.4.4 Veronica366

30.4.5 万维网WWW367

30.5 X窗口系统367

30.5.1 Xscope程序368

30.5.2 LBX: 低带宽X370

30.6 小结370

附录A tcpdump程序371

附录B 计算机时钟376

附录C sock程序378

附录D 部分习题的解答381

附录E 配置选项395

附录F 可以免费获得的源代码406

参考文献409

缩略语420

TCP/IP是供已连接因特网的计算机进行通信的通信协议。

TCP/IP协议TransmissionControlProtocol/InternetProtocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。

TCP/IP传输协议,即传输控制/网络协议,也叫作网络通讯协议。它是在网络的使用中的最基本的通信协议。TCP/IP传输协议对互联网中各部分进行通信的标准和方法进行了规定。并且,TCP/IP传输协议是保证网络数据信息及时、完整传输的两个重要的协议。

TCP/IP传输协议是严格来说是一个四层的体系结构,应用层、传输层、网络层和数据链路层都包含其中。

UDP是面向无连接的,使用起来比较简单,打开socke之后,指定目标端口,直接进行接收和发送:

socket本身提供了一些接口:

需要注意的是, boost.asio.buffer 是一种接口适配器,通过接口进行发送和接收,必须有对应的数据缓冲区提供数据或者存储空间。

同步接收同步发送的UDP服务器也比较简单,创建一个绑定到本地端口的socket,然后就是接收及发送动作:

同步操作是不需要运行IO服务的,以最常规的方式来进行发送和接收,注意接收时如果接收到全部消息,即EOF也是通过报错形式,错误码为 error::message_size 。

实现异步的UDP服务器就略显复杂,需要保证IO服务运行,发起异步操作时要注意数据缓冲区生命周期:

可以看到 do_recv 方法发起了一个异步接收操作,在操作完成回调中再次发起,构造服务器时率先调用了 do_recv ,从而保证IO服务一直运行。

do_recv 方法在发起异步操作前申请了一块内存,接收的内容被保存在这块内存之中,当 do_send 发起异步发送操作时被借用,直到发送完成才将这段内存释放掉。

在构造函数中启动了一个线程来执行IO服务,并detach掉线程,从而保证服务器不阻塞,在析构函数停止了IO服务。

需要注意到的是 remote_ep_ 在执行 do_send 时被 move 了,由于 remote_ep_ 标识了远程端口,而且被声明为成员变量,在接受操作中会被填充远程端口内容,如果多个远程主机同时发起,单个 remote_ep_ 是无法正常处理的,所以一旦内容被填充后,就会转移出去给发送操作使用[个人理解,没有实际测试和验证]。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/200664.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-02
下一篇2023-04-02

发表评论

登录后才能评论

评论列表(0条)

    保存