网络编程4——TCP协议的三大安全机制:三次握手四次挥手+确认应答机制+超时重传机制


前言

本人是一个刚刚上路的IT新兵,菜鸟!分享一点自己的见解,如果有错误的地方欢迎各位大佬莅临指导,如果这篇文章可以帮助到你,劳请大家点赞转发支持一下!

本篇文章主要介绍了传输层的TCP协议中的三大安全机制,今天分享的全都是理论,因此大家一定要认真。


一、TCP协议段与机制

TCP协议的特点

特点说明
有连接刻意保存对端的相关信息
可靠传输尽全力将数据传输过去不是百分百成功,自己会知道数据传输是否成功
面向字节流以一个字节为基本单位(一个数据可以分成几份 多次发多次收)
有接收缓冲区,也有发送缓冲区接收缓冲区:接收方用一个特殊的数据结构来组织接收到的数据,使用数据就从接收缓冲区拿,然后接收缓冲区就会删除已经拿走的数据。
发送缓冲区:发送方将要发送的数据存入发送缓冲区,等发送缓冲区满了,才会集中发送一次,可能会导致BUG(数据写到了发送缓冲区而没有发送出去),因此代码中发送数据时尽量刷新缓冲区
大小不受限对于要传输的数据大小没有要求
全双工一条通信路径,双向通信。(可以同时发送和接收数据)

TCP报头结构

在这里插入图片描述

6位标志位
在这里插入图片描述


TCP协议的机制与特性

TCP的协议段格式,比UDP的协议段格式复杂一万倍!😵😵
所以他的机制与功能也比UDP更加强大!!😇😇

TCP对数据传输提供的管控机制,主要体现在两个方面: 安全和效率
这些机制和多线程的设计原则类似: 保证数据传输安全的前提下,尽可能的提高传输效率

TCP协议的机制与特性
1️⃣连接管理
2️⃣确认应答
3️⃣超时重传
4️⃣流量控制
5️⃣拥塞控制
6️⃣滑动窗口
7️⃣延时应答
8️⃣捎带应答
9️⃣面向字节流
🔟异常处理


二、TCP协议的 连接管理机制

连接管理包括
TCP建立连接:三次握手
TCP断开连接:四次挥手

知识点须知

  • SYN:同步报文段 ,指一方要向另一方,申请建立连接。
    位于6位标志位中的第5位,默认是0,当第5位比特位为1是则认为这是一个SYN报文。
  • ACK:应答报文 , 指对收到对方数据包的确认。
    位于6位标志位中的第2位,默认是0,当第2位比特位为1是则认为这是一个ACK报文。
  • FIN:结束报文 , 指一方要向另一方提出释放连接。
    位于6位标志位中的第6位,默认是0,当第6位比特位为1是则认为这是一个FIN报文。

6位标志位在这里插入图片描述


切记!!!!!

  • TCP是如何实现可靠性的?
    答:依靠 确认应答机制 与 超时重传机制 实现可靠性的。
    可千万不是靠三次握手与四次挥手啊!!!

TCP建立连接:三次握手

握手指的是通信双方,进行一次网络交互。

  • 三次握手相当于 客户端 和 服务器 之间,通过三次交互,建立了连接

建立连接一定是客户端主动发起的

在这里插入图片描述


上述过程:
1️⃣客户端向服务器发送一个SYN( 确认服务器是否可以收到数据 )

2️⃣服务器收到SYN返回给客户端一个ACK( 1.告诉客户端,服务器可以收到数据 2.服务器知道客户端可以发送数据 )

3️⃣服务器向客户端发送一个SYN( 确认客户端是否可以收到数据 )

4️⃣客户端收到SYN返回给服务器一个ACK( 1.告诉服务器,客户端可以收到数据 2.客户端知道服务器可以发送数据 )

  • 这四次交互是为了检验服务器与客户端的收发数据的功能是否正常。

  • 明明完成了四次交互,为什么叫做三次握手呢??

原因是服务器返回给客户端的ACK与发送给客户端的SYN合并成一个报文了。
因此这个报文的标志位的第2位与第5位都是1,就代表这个报文即使ACK报文又是SYN报文。

这两个报文是一定会合并的,因为这个ACK报文与SYN报文是同一个时机触发的(都是由内核来完成的),所以才称之为三次握手,而不是四次握手


TCP断开连接:四次挥手

挥手指的是一方提出的释放连接请求。

断开连接客户端与服务器都有可能主动发起的,下面假设客户端主动申请断开连接
在这里插入图片描述
上述过程与三次握手的过程非常相似,只不过SYN报文换成了FIN报文。

上述过程:
1️⃣客户端向服务器发送一个FIN( 告知服务器,客户端要断开连接 )

2️⃣服务器收到FIN返回给客户端一个ACK( 服务器知道了 )

3️⃣服务器向客户端发送一个FIN( 告知客户端,服务器要断开连接 )

4️⃣客户端收到SYN返回给服务器一个ACK( 客户端知道了 )

不用担心第四次的ACK返回不了,内核会一直维护TCP直到四次挥手结束的。

别想了,就是四次挥手,中间的ACK与FIN不是一定合并的。
原因: ACK与FIN是不同时机触发的
ACK是由内核完成的,会在收到FIN的时候第一时间返回ACK
FIN是调用close方法或进程结束时才会触发的

因此这就和你写的代码有很大的关系了,有两种情况。

1.服务器发现客户端断开连接后,立刻调用close方法,服务器的ACK还没发,那么此时就FIN与ACK就会合并起来一起发出去。
2.服务器发现客户端断开连接后,并没有立刻调用close方法,而是执行了其他操作,服务器的ACK已经发出去了,此时FIN就只能单独发了。

这两个报文是不一定会合并的,所以才称之为四次挥手。


三、TCP协议的 确认应答机制

TCP协议是可靠传输,而保证可靠传输的最核心的机制就是确认应答机制。

确认应答机制的大概内容就是, 每次收到数据 ,都会 给对端发送一个应答报文(ACK) ,应答报文与TCP报文的格式一样

在这里插入图片描述
发送端可以根据有没有收到对端应答报文,来确定这条信息是不是安全可靠的传输给了对端。

但是此时也会遇到一个问题!
在这里插入图片描述

这是正常的回答。但是在网上经常会出现后发先至的情况。就变成了下面这样。

在这里插入图片描述

明明是明晚要回家的意思,因为后发先至,滚啊先到了,变成了回复第一句话的应答,好啊好变成了回复第二句话的应答。那么这个意思可就完全变了。😇😇😇

可以为每句话与回答添加序号
在这里插入图片描述
这样就不会弄巧成拙了。

所以真实的TCP数据传输也引入了序号和确认序号。协议段中的32位序号与32位确认序号

因为TCP传输数据的基本单位是字节,
所以就给发送的每个字节都编了序号。
在这里插入图片描述


在这里插入图片描述

应答报文中确认序号的意义就是告诉发送方,确认序号之前的字节我都收到了,并且确认序号就是你下一个要发送数据的编号。
对应上图中的两个应答报文即,
1001号前面的字节都收到了,你该发1001字节了。
13139号前面的字节都收到了,你该发13139字节了。


确认序号 须知

  • 发送方的确认序号是无意义的数据
  • 确认序号的规则,取自己接收到数据的最后一个字节的 下一个字节的序号 (假设对面发了1000个字节过来,但是我收到的最后一个字节编号是10,那么我给发送方的应答报文ACK中确认序号就是11)。
  • 确认序号的作用:接收方通过ACK的确认序号,告诉发送方哪些数据已经收到了,便于发送方判断数据是否安全完整的送达。

四、TCP协议的 超时重传机制

如果一切都顺利,那么自然一切都好。

但是网络环境是十分复杂的,两台设备进行网络交互,中间要经过许许多多的节点,如果中间任何一个节点,出现了问题都会导致丢包。
因此网络传输中都会有概率出现丢包。

丢包:设备间进行传输的数据包,丢失了一部分或全部丢失都叫做丢包。

以下两种丢包情况会触发超时重传机制:
1️⃣

客户端发送的数据丢失,
服务器没有收到数据,不会返回ACK

在这里插入图片描述
2️⃣

服务器收到数据,但是返回的ACK丢包了。

在这里插入图片描述


这两种情况下,客户端向服务器发送数据,客户端会等待一段时间(TCP为了保证无论在任何环境下都能比较高性能的通信,因此会动态计算这个最大超时时间) 如果一段时间后没有收到应答报文ACK ,发送方就视为数据丢包,就会 触发超时重传机制:重新再发送一遍数据

如果是应答报文ACK丢包,也就是说接收方会重复收到两遍数据,不用担心,TCP已经帮我们处理好了。
TCP会在接收缓冲区中根据数据的序号自动去重,保证应用程序读不到重复数据。

当然了,重新传送的数据也有可能会再次丢包。一旦出现连续丢包,那么网络就出现了非常严重的问题。

TCP针对多次丢包的思路是:多次进行超时重传。
但是没进行一次超时重传,超时等待的时间都会变长(降低重传频率)。
连续多次重传仍无法收到ACK的话,TCP就会尝试重置连接(相当于重新连接),如果重置连接也失败,TCP就会断开连接,放弃通信。

总结

以上就是今天要讲的内容,本文分享了TCP协议中的三个安全机制,今天分享的内容大多是理论,希望大家可以细细品读,如果有哪里不理解,可以私信或评论区沟通。

路漫漫不止修身,也养性。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目 录 译者序 前言 第一部分 TCP事务协议 第1章 T/TCP概述 1 1.1 概述 1 1.2 UDP上的客户-服务器 1 1.3 TCP上的客户-服务器 6 1.4 T/TCP上的客户-服务器 12 1.5 测试网络 15 1.6 时间测量程序 15 1.7 应用 17 1.8 历史 19 1.9 实现 20 1.10 小结 21 第2章 T/TCP协议 23 2.1 概述 23 2.2 T/TCP中的新TCP选项 23 2.3 T/TCP实现所需变量 25 2.4 状态变迁图 27 2.5 T/TCP的扩展状态 28 2.6 小结 30 第3章 T/TCP使用举例 31 3.1 概述 31 3.2 客户重新启动 31 3.3 常规的T/TCP事务 33 3.4 服务器收到过时的重复SYN 34 3.5 服务器重启动 35 3.6 请求或应答超出报文段最大长度MSS 36 3.7 向后兼容性 39 3.8 小结 41 第4章 T/TCP协议(续) 43 4.1 概述 43 4.2 客户的端口号和TIME_WAIT状态 43 4.3 设置TIME_WAIT状态的目的 45 4.4 TIME_WAIT状态的截断 48 4.5 利用TAO跳过三次握手 51 4.6 小结 55 第5章 T/TCP协议的实现:插口层 56 5.1 概述 56 5.2 常量 56 5.3 sosend函数 56 5.4 小结 58 第6章 T/TCP的实现:路由表 59 6.1 概述 59 6.2 代码介绍 59 6.3 radix_node_head结构 60 6.4 rtentry结构 61 6.5 rt_metrics结构 61 6.6 in_inithead函数 61 6.7 in_addroute函数 62 6.8 in_matroute函数 63 6.9 in_clsroute函数 63 6.10 in_rtqtimo函数 64 6.11 in_rtqkill函数 66 6.12 小结 69 第7章 T/TCP实现:协议控制块 70 7.1 概述 70 7.2 in_pcbladdr函数 71 7.3 in_pcbconnect函数 71 7.4 小结 72 第8章 T/TCP实现: TCP概要 73 8.1 概述 73 8.2 代码介绍 73 8.3 TCP的protosw结构 74 8.4 TCP控制块 74 8.5 tcp_init函数 75 8.6 tcp_slowtimo函数 75 8.7 小结 76 第9章 T/TCP实现:TCP输出 77 9.1 概述 77 9.2 tcp_output函数 77 9.2.1 新的自动变量 77 9.2.2 增加隐藏的状态标志 77 9.2.3 在SYN_SENT状态不要重传SYN 78 9.2.4 发送器的糊涂窗口避免机制 78 9.2.5 有RST或SYN标志时强制发送报文段 79 9.2.6 发送MSS选项 80 9.2.7 是否发送时间戳选项 80 9.2.8 发送T/TCP的CC选项 80 9.2.9 根据TCP选项调整数据长度 83 9.3 小结 83 第10章 T/TCP实现:TCP函数 84 10.1 概述 84 10.2 tcp_newtcpcb函数 84 10.3 tcp_rtlookup函数 85 10.4 tcp_gettaocache函数 86 10.5 重传超时间隔的计算 86 10.6 tcp_close函数 89 10.7 tcp_msssend函数 90 10.8 tcp_mssrcvd函数 91 10.9 tcp_dooptions函数 96 10.10 tcp_reass函数 98 10.11 小结 99 第11章 T/TCP实现:TCP输入 101 11.1 概述 101 11.2 预处理 103 11.3 首部预测 104 11.4 被动打开的启动 105 11.5 主动打开的启动 108 11.6 PAWS:防止序号重复 114 11.7 ACK处理 115 11.8 完成被动打开和同时打开 115 11.9 ACK处理(续) 116 11.10 FIN处理 118 11.11 小结 119 第12章 T/TCP实现:TCP用户请求 120 12.1 概述 120 12.2 PRU_CONNECT请求 120 12.3 tcp_connect函数 120 12.4 PRU_SEND和PRU_SEND_EOF请求 124 12.5 tcp_usrclosed函数 125 12.6 tcp_sysctl函数 126 12.7 T/TCP的前景 126 12.8 小结 127 第二部分 TCP的其他应用 第13章 HTTP:超文本传送协议 129 13.1 概述 129 13.2 HTTP和HTML概述 130 13.3 HTTP 132 13.3.1 报文类型:请求与响应 132 13.3.2 首部字段 133 13.3.3 响应代码 133 13.3.4 各种报文头举例 134 13.3.5 例子:客户程序缓存 135 13.3.6 例子:服务器重定向 136 13.4 一个例子 136 13.5 HTTP的统计资料 138 13.6 性能问题 139 13.7 小结 141 第14章 在HTTP服务器上找到的分组 142 14.1 概述 142 14.2 多个HTTP服务器 144 14.3 客户端SYN的到达间隔时间 145 14.4 RTT的测量 149 14.5 用listen设置入连接队列的容量 150 14.6 客户端的SYN选项 154 14.7 客户端的SYN重传 156 14.8 域名 157 14.9 超时的持续探测 157 14.10 T/TCP路由表大小的模拟 160 14.11 mbuf的交互 162 14.12 TCP的PCB高速缓存和首部预测 163 14.13 小结 165 第15章 NNTP:网络新闻传送协议 166 15.1 概述 166 15.2 NNTP 167 15.3 一个简单的新闻客户 170 15.4 一个复杂的新闻客户 171 15.5 NNTP的统计资料 172 15.6 小结 173 第三部分 Unix域协议 第16章 Unix域协议:概述 175 16.1 概述 175 16.2 用途 176 16.3 性能 177 16.4 编码举例 177 16.5 小结 179 第17章 Unix域协议:实现 180 17.1 概述 180 17.2 代码介绍 180 17.3 Unix domain和protosw结构 181 17.4 Unix域插口地址结构 182 17.5 Unix域协议控制块 183 17.6 uipc_usrreq函数 185 17.7 PRU_ATTACH请求和unp_attach函数 186 17.8 PRU_DETACH请求和unp_detach函数 187 17.9 PRU_BIND请求和unp_bind函数 189 17.10 PRU_CONNECT请求和unp_connect 函数 191 17.11 PRU_CONNECT2请求和unp_connect2 函数 195 17.12 socketpair系统调用 198 17.13 pipe系统调用 202 17.14 PRU_ACCEPT请求 203 17.15 PRU_DISCONNECT请求和 unp_disconnect函数 204 17.16 PRU_SHUTDOWN请求和unp_shutdown 函数 205 17.17 PRU_ABORT请求和unp_drop函数 206 17.18 其他各种请求 207 17.19 小结 209 第18章 Unix域协议:I/O和描述符的传递 210 18.1 概述 210 18.2 PRU_SEND和PRU_RCVD请求 210 18.3 描述符的传递 214 18.4 unp_internalize函数 218 18.5 unp_externalize函数 220 18.6 unp_discard函数 221 18.7 unp_dispose函数 222 18.8 unp_scan函数 222 18.9 unp_gc函数 223 18.10 unp_mark函数 230 18.11 性能(再讨论) 231 18.12 小结 231 附录A 测量网络时间 232 附录B 编写T/TCP应用程序 242 参考文献 246 缩略语 251
TCP/IP详解·卷3:TCP事务协议、HTTP、NNTP和UNIX域协议》是“TCP/IP详解系列”的延续。主要内容包括:TCP事务协议,即T/TCP,这是对TCP的扩展,使客户-服务器事务更快、更高效和更可靠;TCP/IP应用,主要是HTTP和NNTP;UNIX域协议,这些协议提供了进程之间通信的一种手段。当客户与服务器进程在同一台主机上时,UNIX域协议通常要比TCP/IP快一倍。《TCP/IP详解·卷3:TCP事务协议、HTTP、NNTP和UNIX域协议》同样采用了大量的实例和实现细节,并参考引用了卷2中的大量源程序。适用于希望理解TCP/IP如何工作的人,包括编写网络应用程序的程序员以及利用TCP/IP维护计算机网络的系统管理员。 目录: 前言 第一部分 CP事务协议 第1章 /CP概述 1.1 概述 1.2 UDP上的客户-服务器 1.3 CP上的客户-服务器 1.4 /CP上的客户-服务器 1.5 测试网络 1.6 时间测量程序 1.7 应用 1.8 历史 1.9 实现 1.10 小结 第2章 /CP协议 2.1 概述 2.2 /CP中的新CP选项 2.3 /CP实现所需变量 2.4 状态变迁图 2.5 /CP的扩展状态 2.6 小结 第3章 /CP使用举例 3.1 概述 3.2 客户重新启动 3.3 常规的/CP事务 3.4 服务器收到过时的重复SY 3.5 服务器重启动 3.6 请求或应答超出报文段最大长度MSS 3.7 向后兼容性 3.8 小结 第4章 /CP协议(续) 4.1 概述 4.2 客户的端口号和IME_WAI状态 4.3 设置IME_WAI状态的目的 4.4 IME_WAI状态的截断 4.5 利用A跳过三次握手 4.6 小结 第5章 /CP协议的实现:插口层 5.1 概述 5.2 常量 5.3 ssed函数 5.4 小结 第6章 /CP的实现:路由表 6.1 概述 6.2 代码介绍 6.3 radix_de_head结构 6.4 rery结构 6.5 r_merics结构 6.6 i_iihead函数 6.7 i_addrue函数 6.8 i_marue函数 6.9 i_clsrue函数 6.10 i_rqim函数 6.11 i_rqkill函数 6.12 小结 第7章 /CP实现:协议控制块 7.1 概述 7.2 i_pcbladdr函数 7.3 i_pcbcec函数 7.4 小结 第8章 /CP实现: CP概要 8.1 概述 8.2 代码介绍 8.3 CP的prsw结构 8.4 CP控制块 8.5 cp_ii函数 8.6 cp_slwim函数 8.7 小结 第9章 /CP实现:CP输出 9.1 概述 9.2 cp_upu函数 9.2.1 新的自动变量 9.2.2 增加隐藏的状态标志 9.2.3 在SY_SE状态不要重传SY 9.2.4 发送器的糊涂窗口避免机制 9.2.5 有RS或SY标志时强制发送报文段 9.2.6 发送MSS选项 9.2.7 是否发送时间戳选项 9.2.8 发送/CP的CC选项 9.2.9 根据CP选项调整数据长度 9.3 小结 第10章 /CP实现:CP函数 10.1 概述 10.2 cp_ewcpcb函数 10.3 cp_rlkup函数 10.4 cp_geacache函数 10.5 重传超时间隔的计算 10.6 cp_clse函数 10.7 cp_msssed函数 10.8 cp_mssrcvd函数 10.9 cp_dpis函数 10.10 cp_reass函数 10.11 小结 第11章 /CP实现:CP输入 11.1 概述 11.2 预处理 11.3 首部预测 11.4 被动打开的启动 11.5 主动打开的启动 11.6 PAWS:防止序号重复 11.7 ACK处理 11.8 完成被动打开和同时打开 11.9 ACK处理(续) 11.10 FI处理 11.11 小结 第12章 /CP实现:CP用户请求 12.1 概述 12.2 PRU_CEC请求 12.3 cp_cec函数 12.4 PRU_SED和PRU_SED_EF请求 12.5 cp_usrclsed函数 12.6 cp_syscl函数 12.7 /CP的前景 12.8 小结 第二部分 CP的其他应用 第13章 HP:超文本传送协议 13.1 概述 13.2 HP和HML概述 13.3 HP 13.3.1 报文类型:请求与响应 13.3.2 首部字段 13.3.3 响应代码 13.3.4 各种报文头举例 13.3.5 例子:客户程序缓存 13.3.6 例子:服务器重定向 13.4 一个例子 13.5 HP的统计资料 13.6 性能问题 13.7 小结 第14章 在HP服务器上找到的分组 14.1 概述 14.2 多个HP服务器 14.3 客户端SY的到达间隔时间 14.4 R的测量 14.5 用lise设置入连接队列的容量 14.6 客户端的SY选项 14.7 客户端的SY重传 14.8 域名 14.9 超时的持续探测 14.10 /CP路由表大小的模拟 14.11 mbuf的交互 14.12 CP的PCB高速缓存和首部预测 14.13 小结 第15章 P:网络新闻传送协议 15.1 概述 15.2 P 15.3 一个简单的新闻客户 15.4 一个复杂的新闻客户 15.5 P的统计资料 15.6 小结 第三部分 Uix域协议 第16章 Uix域协议:概述 16.1 概述 16.2 用途 16.3 性能 16.4 编码举例 16.5 小结 第17章 Uix域协议:实现 17.1 概述 17.2 代码介绍 17.3 Uix dmai和prsw结构 17.4 Uix域插口地址结构 17.5 Uix域协议控制块 17.6 uipc_usrreq函数 17.7 PRU_AACH请求和up_aach函数 17.8 PRU_DEACH请求和up_deach函数 17.9 PRU_BID请求和up_bid函数 17.10 PRU_CEC请求和up_cec函数 17.11 PRU_CEC2请求和up_cec2函数 17.12 sckepair系统调用 17.13 pipe系统调用 17.14 PRU_ACCEP请求 17.15 PRU_DISCEC请求和up_discec函数 17.16 PRU_SHUDW请求和up_shudw函数 17.17 PRU_ABR请求和up_drp函数 17.18 其他各种请求 17.19 小结 第18章 Uix域协议:I/和描述符的传递 18.1 概述 18.2 PRU_SED和PRU_RCVD请求 18.3 描述符的传递 18.4 up_ieralize函数 18.5 up_exeralize函数 18.6 up_discard函数 18.7 up_dispse函数 18.8 up_sca函数 18.9 up_gc函数 18.10 up_mark函数 18.11 性能(再讨论) 18.12 小结 附录A 测量网络时间 附录B 编写/CP应用程序 参考文献
目 录 译者序 前言 第一部分 TCP事务协议 第1章 T/TCP概述 1 1.1 概述 1 1.2 UDP上的客户-服务器 1 1.3 TCP上的客户-服务器 6 1.4 T/TCP上的客户-服务器 12 1.5 测试网络 15 1.6 时间测量程序 15 1.7 应用 17 1.8 历史 19 1.9 实现 20 1.10 小结 21 第2章 T/TCP协议 23 2.1 概述 23 2.2 T/TCP中的新TCP选项 23 2.3 T/TCP实现所需变量 25 2.4 状态变迁图 27 2.5 T/TCP的扩展状态 28 2.6 小结 30 第3章 T/TCP使用举例 31 3.1 概述 31 3.2 客户重新启动 31 3.3 常规的T/TCP事务 33 3.4 服务器收到过时的重复SYN 34 3.5 服务器重启动 35 3.6 请求或应答超出报文段最大长度MSS 36 3.7 向后兼容性 39 3.8 小结 41 第4章 T/TCP协议(续) 43 4.1 概述 43 4.2 客户的端口号和TIME_WAIT状态 43 4.3 设置TIME_WAIT状态的目的 45 4.4 TIME_WAIT状态的截断 48 4.5 利用TAO跳过三次握手 51 4.6 小结 55 第5章 T/TCP协议的实现:插口层 56 5.1 概述 56 5.2 常量 56 5.3 sosend函数 56 5.4 小结 58 第6章 T/TCP的实现:路由表 59 6.1 概述 59 6.2 代码介绍 59 6.3 radix_node_head结构 60 6.4 rtentry结构 61 6.5 rt_metrics结构 61 6.6 in_inithead函数 61 6.7 in_addroute函数 62 6.8 in_matroute函数 63 6.9 in_clsroute函数 63 6.10 in_rtqtimo函数 64 6.11 in_rtqkill函数 66 6.12 小结 69 第7章 T/TCP实现:协议控制块 70 7.1 概述 70 7.2 in_pcbladdr函数 71 7.3 in_pcbconnect函数 71 7.4 小结 72 第8章 T/TCP实现: TCP概要 73 8.1 概述 73 8.2 代码介绍 73 8.3 TCP的protosw结构 74 8.4 TCP控制块 74 8.5 tcp_init函数 75 8.6 tcp_slowtimo函数 75 8.7 小结 76 第9章 T/TCP实现:TCP输出 77 9.1 概述 77 9.2 tcp_output函数 77 9.2.1 新的自动变量 77 9.2.2 增加隐藏的状态标志 77 9.2.3 在SYN_SENT状态不要重传SYN 78 9.2.4 发送器的糊涂窗口避免机制 78 9.2.5 有RST或SYN标志时强制发送报文段 79 9.2.6 发送MSS选项 80 9.2.7 是否发送时间戳选项 80 9.2.8 发送T/TCP的CC选项 80 9.2.9 根据TCP选项调整数据长度 83 9.3 小结 83 第10章 T/TCP实现:TCP函数 84 10.1 概述 84 10.2 tcp_newtcpcb函数 84 10.3 tcp_rtlookup函数 85 10.4 tcp_gettaocache函数 86 10.5 重传超时间隔的计算 86 10.6 tcp_close函数 89 10.7 tcp_msssend函数 90 10.8 tcp_mssrcvd函数 91 10.9 tcp_dooptions函数 96 10.10 tcp_reass函数 98 10.11 小结 99 第11章 T/TCP实现:TCP输入 101 11.1 概述 101 11.2 预处理 103 11.3 首部预测 104 11.4 被动打开的启动 105 11.5 主动打开的启动 108 11.6 PAWS:防止序号重复 114 11.7 ACK处理 115 11.8 完成被动打开和同时打开 115 11.9 ACK处理(续) 116 11.10 FIN处理 118 11.11 小结 119 第12章 T/TCP实现:TCP用户请求 120 12.1 概述 120 12.2 PRU_CONNECT请求 120 12.3 tcp_connect函数 120 12.4 PRU_SEND和PRU_SEND_EOF请求 124 12.5 tcp_usrclosed函数 125 12.6 tcp_sysctl函数 126 12.7 T/TCP的前景 126 12.8 小结 127 第二部分 TCP的其他应用 第13章 HTTP:超文本传送协议 129 13.1 概述 129 13.2 HTTP和HTML概述 130 13.3 HTTP 132 13.3.1 报文类型:请求与响应 132 13.3.2 首部字段 133 13.3.3 响应代码 133 13.3.4 各种报文头举例 134 13.3.5 例子:客户程序缓存 135 13.3.6 例子:服务器重定向 136 13.4 一个例子 136 13.5 HTTP的统计资料 138 13.6 性能问题 139 13.7 小结 141 第14章 在HTTP服务器上找到的分组 142 14.1 概述 142 14.2 多个HTTP服务器 144 14.3 客户端SYN的到达间隔时间 145 14.4 RTT的测量 149 14.5 用listen设置入连接队列的容量 150 14.6 客户端的SYN选项 154 14.7 客户端的SYN重传 156 14.8 域名 157 14.9 超时的持续探测 157 14.10 T/TCP路由表大小的模拟 160 14.11 mbuf的交互 162 14.12 TCP的PCB高速缓存和首部预测 163 14.13 小结 165 第15章 NNTP:网络新闻传送协议 166 15.1 概述 166 15.2 NNTP 167 15.3 一个简单的新闻客户 170 15.4 一个复杂的新闻客户 171 15.5 NNTP的统计资料 172 15.6 小结 173 第三部分 Unix域协议 第16章 Unix域协议:概述 175 16.1 概述 175 16.2 用途 176 16.3 性能 177 16.4 编码举例 177 16.5 小结 179 第17章 Unix域协议:实现 180 17.1 概述 180 17.2 代码介绍 180 17.3 Unix domain和protosw结构 181 17.4 Unix域插口地址结构 182 17.5 Unix域协议控制块 183 17.6 uipc_usrreq函数 185 17.7 PRU_ATTACH请求和unp_attach函数 186 17.8 PRU_DETACH请求和unp_detach函数 187 17.9 PRU_BIND请求和unp_bind函数 189 17.10 PRU_CONNECT请求和unp_connect 函数 191 17.11 PRU_CONNECT2请求和unp_connect2 函数 195 17.12 socketpair系统调用 198 17.13 pipe系统调用 202 17.14 PRU_ACCEPT请求 203 17.15 PRU_DISCONNECT请求和 unp_disconnect函数 204 17.16 PRU_SHUTDOWN请求和unp_shutdown 函数 205 17.17 PRU_ABORT请求和unp_drop函数 206 17.18 其他各种请求 207 17.19 小结 209 第18章 Unix域协议:I/O和描述符的传递 210 18.1 概述 210 18.2 PRU_SEND和PRU_RCVD请求 210 18.3 描述符的传递 214 18.4 unp_internalize函数 218 18.5 unp_externalize函数 220 18.6 unp_discard函数 221 18.7 unp_dispose函数 222 18.8 unp_scan函数 222 18.9 unp_gc函数 223 18.10 unp_mark函数 230 18.11 性能(再讨论) 231 18.12 小结 231 附录A 测量网络时间 232 附录B 编写T/TCP应用程序 242 参考文献 246 缩略语 251
目 录 译者序 前言 第一部分 TCP事务协议 第1章 T/TCP概述 1 1.1 概述 1 1.2 UDP上的客户-服务器 1 1.3 TCP上的客户-服务器 6 1.4 T/TCP上的客户-服务器 12 1.5 测试网络 15 1.6 时间测量程序 15 1.7 应用 17 1.8 历史 19 1.9 实现 20 1.10 小结 21 第2章 T/TCP协议 23 2.1 概述 23 2.2 T/TCP中的新TCP选项 23 2.3 T/TCP实现所需变量 25 2.4 状态变迁图 27 2.5 T/TCP的扩展状态 28 2.6 小结 30 第3章 T/TCP使用举例 31 3.1 概述 31 3.2 客户重新启动 31 3.3 常规的T/TCP事务 33 3.4 服务器收到过时的重复SYN 34 3.5 服务器重启动 35 3.6 请求或应答超出报文段最大长度MSS 36 3.7 向后兼容性 39 3.8 小结 41 第4章 T/TCP协议(续) 43 4.1 概述 43 4.2 客户的端口号和TIME_WAIT状态 43 4.3 设置TIME_WAIT状态的目的 45 4.4 TIME_WAIT状态的截断 48 4.5 利用TAO跳过三次握手 51 4.6 小结 55 第5章 T/TCP协议的实现:插口层 56 5.1 概述 56 5.2 常量 56 5.3 sosend函数 56 5.4 小结 58 第6章 T/TCP的实现:路由表 59 6.1 概述 59 6.2 代码介绍 59 6.3 radix_node_head结构 60 6.4 rtentry结构 61 6.5 rt_metrics结构 61 6.6 in_inithead函数 61 6.7 in_addroute函数 62 6.8 in_matroute函数 63 6.9 in_clsroute函数 63 6.10 in_rtqtimo函数 64 6.11 in_rtqkill函数 66 6.12 小结 69 第7章 T/TCP实现:协议控制块 70 7.1 概述 70 7.2 in_pcbladdr函数 71 7.3 in_pcbconnect函数 71 7.4 小结 72 第8章 T/TCP实现: TCP概要 73 8.1 概述 73 8.2 代码介绍 73 8.3 TCP的protosw结构 74 8.4 TCP控制块 74 8.5 tcp_init函数 75 8.6 tcp_slowtimo函数 75 8.7 小结 76 第9章 T/TCP实现:TCP输出 77 9.1 概述 77 9.2 tcp_output函数 77 9.2.1 新的自动变量 77 9.2.2 增加隐藏的状态标志 77 9.2.3 在SYN_SENT状态不要重传SYN 78 9.2.4 发送器的糊涂窗口避免机制 78 9.2.5 有RST或SYN标志时强制发送报文段 79 9.2.6 发送MSS选项 80 9.2.7 是否发送时间戳选项 80 9.2.8 发送T/TCP的CC选项 80 9.2.9 根据TCP选项调整数据长度 83 9.3 小结 83 第10章 T/TCP实现:TCP函数 84 10.1 概述 84 10.2 tcp_newtcpcb函数 84 10.3 tcp_rtlookup函数 85 10.4 tcp_gettaocache函数 86 10.5 重传超时间隔的计算 86 10.6 tcp_close函数 89 10.7 tcp_msssend函数 90 10.8 tcp_mssrcvd函数 91 10.9 tcp_dooptions函数 96 10.10 tcp_reass函数 98 10.11 小结 99 第11章 T/TCP实现:TCP输入 101 11.1 概述 101 11.2 预处理 103 11.3 首部预测 104 11.4 被动打开的启动 105 11.5 主动打开的启动 108 11.6 PAWS:防止序号重复 114 11.7 ACK处理 115 11.8 完成被动打开和同时打开 115 11.9 ACK处理(续) 116 11.10 FIN处理 118 11.11 小结 119 第12章 T/TCP实现:TCP用户请求 120 12.1 概述 120 12.2 PRU_CONNECT请求 120 12.3 tcp_connect函数 120 12.4 PRU_SEND和PRU_SEND_EOF请求 124 12.5 tcp_usrclosed函数 125 12.6 tcp_sysctl函数 126 12.7 T/TCP的前景 126 12.8 小结 127 第二部分 TCP的其他应用 第13章 HTTP:超文本传送协议 129 13.1 概述 129 13.2 HTTP和HTML概述 130 13.3 HTTP 132 13.3.1 报文类型:请求与响应 132 13.3.2 首部字段 133 13.3.3 响应代码 133 13.3.4 各种报文头举例 134 13.3.5 例子:客户程序缓存 135 13.3.6 例子:服务器重定向 136 13.4 一个例子 136 13.5 HTTP的统计资料 138 13.6 性能问题 139 13.7 小结 141 第14章 在HTTP服务器上找到的分组 142 14.1 概述 142 14.2 多个HTTP服务器 144 14.3 客户端SYN的到达间隔时间 145 14.4 RTT的测量 149 14.5 用listen设置入连接队列的容量 150 14.6 客户端的SYN选项 154 14.7 客户端的SYN重传 156 14.8 域名 157 14.9 超时的持续探测 157 14.10 T/TCP路由表大小的模拟 160 14.11 mbuf的交互 162 14.12 TCP的PCB高速缓存和首部预测 163 14.13 小结 165 第15章 NNTP:网络新闻传送协议 166 15.1 概述 166 15.2 NNTP 167 15.3 一个简单的新闻客户 170 15.4 一个复杂的新闻客户 171 15.5 NNTP的统计资料 172 15.6 小结 173 第三部分 Unix域协议 第16章 Unix域协议:概述 175 16.1 概述 175 16.2 用途 176 16.3 性能 177 16.4 编码举例 177 16.5 小结 179 第17章 Unix域协议:实现 180 17.1 概述 180 17.2 代码介绍 180 17.3 Unix domain和protosw结构 181 17.4 Unix域插口地址结构 182 17.5 Unix域协议控制块 183 17.6 uipc_usrreq函数 185 17.7 PRU_ATTACH请求和unp_attach函数 186 17.8 PRU_DETACH请求和unp_detach函数 187 17.9 PRU_BIND请求和unp_bind函数 189 17.10 PRU_CONNECT请求和unp_connect 函数 191 17.11 PRU_CONNECT2请求和unp_connect2 函数 195 17.12 socketpair系统调用 198 17.13 pipe系统调用 202 17.14 PRU_ACCEPT请求 203 17.15 PRU_DISCONNECT请求和 unp_disconnect函数 204 17.16 PRU_SHUTDOWN请求和unp_shutdown 函数 205 17.17 PRU_ABORT请求和unp_drop函数 206 17.18 其他各种请求 207 17.19 小结 209 第18章 Unix域协议:I/O和描述符的传递 210 18.1 概述 210 18.2 PRU_SEND和PRU_RCVD请求 210 18.3 描述符的传递 214 18.4 unp_internalize函数 218 18.5 unp_externalize函数 220 18.6 unp_discard函数 221 18.7 unp_dispose函数 222 18.8 unp_scan函数 222 18.9 unp_gc函数 223 18.10 unp_mark函数 230 18.11 性能(再讨论) 231 18.12 小结 231 附录A 测量网络时间 232 附录B 编写T/TCP应用程序 242 参考文献 246 缩略语 251

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值