章节回顾:

《TCP/IP详解卷1:协议》第1章 概述-读书笔记

《TCP/IP详解卷1:协议》第2章 链路层-读书笔记

《TCP/IP详解卷1:协议》第3章 IP:网际协议(1)-读书笔记

《TCP/IP详解卷1:协议》第3章 IP:网际协议(2)-读书笔记

《TCP/IP详解卷1:协议》第4章 ARP:地址解析协议-读书笔记

《TCP/IP详解卷1:协议》第5章 RARP:逆地址解析协议-读书笔记

《TCP/IP详解卷1:协议》第6章 ICMP:Internet控制报文协议-读书笔记

《TCP/IP详解卷1:协议》第11章 UDP:用户数据报协议-读书笔记

《TCP/IP详解卷1:协议》第17、18章 TCP:传输控制协议(1)-读书笔记

《TCP/IP详解卷1:协议》第17、18章 TCP:传输控制协议(2)-读书笔记

《TCP/IP详解卷1:协议》第19章 TCP的交互数据流-读书笔记


第17章 TCP:传输控制协议

1、TCP服务

尽管TCP和UDP都使用相同的网络层(IP),TCP却向应用层提供与UDP完全不同的服务。TCP提供一种面向连接的、可靠的字节流服务

(1)面向连接

两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接。过程与打电话相似,先拨号振铃,等待对方摘机说“喂”,然后才说明是谁。

说明:在一个TCP连接中,仅有两方彼此进行通信。广播和多播不能用于TCP。

(2)可靠性

TCP通过下列方式来提供可靠性:

1)应用数据被分割成T C P认为最适合发送的数据块。由TCP传递给IP的信息单位称为报文段或段。

注意:对于UDP,应用程序产生的数据报长度将保持不变。

2)当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。

3)当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒。

4)TCP将保持它的首部和数据检验和。这是一个端到端的检验和,如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)。

5)因为TCP报文段是作为IP数据报来传输的,而IP数据报的到达可能会失序,所以TCP报文段的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。

6)因为IP数据报会发生重复,所以TCP的接收端必须丢弃重复的数据。

7)TCP提供流量控制。TCP连接的每一方都有固定大小的缓冲区。TCP的接收端只允许另一端发送其缓冲区所能接纳的数据。可防止较快主机致使较慢主机的缓冲区溢出。

说明:

1)两个应用程序通过TCP连接交换8 bit构成的字节流。TCP不在字节流中插入记录标识符。将这称为字节流服务。

2)假设一方的应用程序先传10字节,又传20字节,再传50字节,连接的另一方将无法了解发方每次发送了多少字节。收方可以分4次接收这80个字节,每次接收20字节。

3)TCP对字节流的内容不作任何解释,它不知道传输的数据字节流是二进制数据、ASCII字符、EBCDIC字符或其他类型数据。由TCP双方的应用层对字节流进行解释。

2、TCP首部

TCP数据被封装在一个IP数据报中,如图17-1所示。

图17-2显示TCP首部的数据格式。如果不计选项字段,它通常是20个字节

TCP首部字段说明:

(1)TCP段包含的源端和目的端端口号,是用于寻找发端和收端应用进程

说明:源端和目的端端口号加上源端IP地址和目的端IP地址唯一确定一个TCP连接。

(2)序号用来标识从TCP发端向收端发送的数据字节流。如果将字节流看作是在两个应用程序间的单向流动,则TCP用序号对每个字节进行计数。序号是32 bit的无符号数,到达2^32-1后又从0开始。

说明:TCP为应用层提供全双工服务。这意味着数据能在两个方向上独立进行传输。所以,连接的每一端必须保持每个方向上的传输数据序号。

(3)当建立一个新的连接时,SYN标志置1。

(4)因为每个传输的字节都被计数,确认序号包含发送确认的一端所期望收到的下一个序号,即确认序号是上次已成功收到数据字节序号加1。

注意:只有ACK标志为1时确认序号字段才有效。

(5)发送ACK无需任何代价,因为32 bit的确认序号字段和ACK标志一样,总是TCP首部的一部分。因此,一旦一个连接建立起来,这个字段总是被设置,ACK标志也总是被设置为1。

(6)首部长度给出首部中32 bit字的数目。需要这个值是因为任选字段的长度是可变的。这个字段占4 bit,因此TCP最多有60字节的首部(32bit*(2^4-1))。如果没有选项字段,正常的长度是20字节。

(7)TCP首部中有6个标志比特,它们中的多个可同时被设置为1。含义为:

1)URG 紧急指针有效。

2)ACK 确认序号有效。

3)PSH 接收方应该尽快将这个报文段交给应用层。

4)RST 重建连接。

5)SYN 同步序号用来发起一个连接。

6)FIN 发端完成发送任务。

(8)TCP的流量控制由连接的每一端通过声明的窗口大小来提供。窗口大小为字节数,起始于确认序号字段指明的值,这个值是接收端期望接收的字节。窗口大小是一个16 bit字段,因而窗口大小最大为65535字节。

(9)检验和覆盖了整个TCP报文段包括TCP首部和TCP数据。这是一个强制性的字段,一定是由发端计算和存储,并由收端进行验证。

说明:TCP检验和的计算与UDP检验和的计算相似,使用一个伪首部。

(10)只有当URG标志置1时紧急指针才有效。紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。

(11)最常见的选项字段是最长报文大小,又称为MSS (Maximum Segment Size)。每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志的那个段)中指明这个选项。它指明本端所能接收的最大长度的报文段。

(12)TCP报文段中的数据部分是可选的。例如:一个连接建立和终止时,双方交换的报文段仅有TCP首部。在处理超时的许多情况中,也会发送不带任何数据的报文段。

小结:

(1)TCP提供了一种可靠的面向连接的字节流运输层服务。

(2)TCP将用户数据打包构成报文段;它发送数据后启动一个定时器;另一端对收到的数据进行确认,对失序的数据重新排序,丢弃重复数据;TCP提供端到端的流量控制,并计算和验证一个强制性的端到端检验和。

(3)许多流行的应用程序如Telnet、Rlogin、FTP和SMTP都使用TCP。


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

1、引言

TCP是一个面向连接的协议。无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。

2、连接的建立与终止

(1)建立连接协议

如果18-3所示,为了建立一条TCP连接:

1)请求端(客户)发送一个SYN段指明客户打算连接的服务器的端口,以及初始序号(ISN,例子中为1415531521),如报文1。

2)服务器发回包含服务器的初始序号的SYN报文段(报文段2)作为应答。同时,将确认序号设置为客户的ISN加1以对客户的SYN报文段进行确认。一个SYN将占用一个序号。

3)客户必须将确认序号设置为服务器的ISN加1以对服务器的SYN报文段进行确认(报文段3)。

这三个报文段完成连接的建立,这个过程也称为三次握手

说明:

1)发送第一个SYN的一端将执行主动打开,接收这个SYN并发回下一个SYN的另一端执行被动打开。

2)当一端为建立连接而发送它的SYN时,它为连接选择一个初始序号。ISN随时间而变化,因此每个连接都将具有不同的ISN。

(2)终止连接

终止一个连接要经过4次握手。这是由TCP的半关闭造成的。

说明:

1)因为TCP是全双工的(数据在两个方向上能同时传递),因此每个方向必须单独进行关闭。原则是:当一方完成它的数据发送任务后发送一个FIN来终止这个方向连接。当一端收到一个FIN时,它必须通知应用层另一端已经终止了那个方向的数据传送。

注意:发送FIN通常是应用层进行关闭的结果。

2)收到一个FIN只意味着在这一方向上没有数据流动。

注意:一个TCP连接在收到一个FIN后仍能发送数据,这对利用半关闭的应用来说是可能的,尽管在实际应用中只有很少的TCP应用程序这样做。

图18-4显示了终止一个连接的典型握手顺序。

发送FIN将导致应用程序关闭它们的连接,这些FIN的ACK是由TCP软件自动产生的。


说明:上面内容包括《TCP/IP详解卷1:协议》第17章内容以及18章的一点内容(TCP连接的建立与终止),18章还有部分内容分析各种连接问题,内容较多,明天才能总结出来。

《TCP/IP详解卷1:协议》第17、18章 TCP:传输控制协议(1)-读书笔记的更多相关文章

  1. 【TCP/IP详解 卷一:协议】第二十一章 TCP的超时与重传

    作为TCP的重头戏,本章节涉及了许多关于计算方面的内容,使用了大量的例子来指明一些观点. 我使用的理解方法是:通过别人的博客,以及实例结合进行理解,不然会很吃力. 21.1 引言 reliable T ...

  2. 【TCP/IP详解 卷一:协议】第十七章 TCP:传输控制协议

    本章作为TCP的入门章节,简单的概述了一些TCP的知识,和TCP数据报的首部格式. TCP 最重要的特性:reliable. 17.1 引言 本章介绍的是 TCP为应用层提供的服务. 17.2 TCP ...

  3. 【TCP/IP详解 卷一:协议】第二十三章 TCP的保活定时器

    本章介绍保活定时器. 在 TCP 的三握四挥 章节中,我们介绍了 处在 TIME_WAIT 的 2MSL定时器:在 TCP的超时与重传 章节中,我们介绍了 重传定时器:在上一章节中,我们介绍了 防止死 ...

  4. 《TCP/IP详解 卷1:协议》读书笔记

    第一章 概述 协议栈 应用层 HTTP,FTP   运输层 TCP, UDP 段(Segment) 网络层 IP, ICMP, IGMP 数据报(Datagram) 链路层   帧(Frame) 物理 ...

  5. tcp/ip详解 卷1 -- 协议概述

    第一章 概述 分层 TCP/IP 通常被认为是一个四层协议系统. 每一层负责不同的功能. 链路层, 也成为数据链路层或者网络接口层. 通常包括 操作系统中的设备驱动程序和计算机中对应的网络接口卡. 主 ...

  6. 【TCP/IP详解 卷一:协议】第十一章 UDP 用户数据报协议

    11.1 引言 UDP 是一个简单的 面向数据报 的运输层协议:进程的每个 输出操作 都正好产生一个 UDP数据报,并且组装成一份待发送的IP数据报. 这与 TCP 不一样,它是 面向流字符 的协议, ...

  7. 【TCP/IP详解 卷一:协议】第六章:DHCP 和自动配置

    简介 为了使用 TCP/IP 协议族,每台主机or路由器都需要一定的配置信息: IP地址 子网掩码 广播地址 路由或转发表 DNS 协议配置方法: 手动 通过使用网络服务来获得 使用一些算法来自动确定 ...

  8. 【TCP/IP详解 卷一:协议】第十八章 TCP连接 的建立与终止 (2)其余内容

    18.5 TCP的半关闭 牢记 TCP 是 全双工 的. 半关闭:TCP提供了连接的一端 在结束了它的发送后 还能接收来自另外一端数据的能力.但是只有很少的应用程序利用它. 为了实现这个特性,编程接口 ...

  9. 【TCP/IP详解 卷一:协议】第四章 ARP:地址解析协议 以及其他部分的一些知识

    4.1 引言 数据链路 如以太网(Ethernet) 或者 令牌环网 都有自己的寻址机制(一般为 48 bit 的地址). 一个网络(数据链路层) 可以同时被多个不同的网络使用.比如,一组使用TCP/ ...

  10. 【TCP/IP详解 卷一:协议】第9章 IP选路

    推荐链接:网络地址与主机地址 9.1 引言 路由选择程序(daemon),通常这是一个用户进程.在大多数的Unix系统中,大多数的路由选择程序都是路由程序和网关程序. 路由表经常被IP访问,但是它被路 ...

随机推荐

  1. Plus One

    Plus One https://leetcode.com/problems/plus-one/ Given a non-negative number represented as an array ...

  2. 微信微博分享注意事项(sharesdk)

    0.(重要)如果接入多渠道可以考虑微博微信appid appkey等信息放到服务端,方便临时修改又可避免很多渠道时替换ShareSDK.xml文件出错. 但是cocos2dx-2.x版本使用代码配置a ...

  3. BusyBox Init

    嵌入式系统内核启动后的第一个程序就是init,一般位于/sbin/init(一般是符号链接到/bin/busybox), 但有些也会直接放在根目录下如linuxrc,busybox的init不支持多级 ...

  4. SSAS-many 2 many one simple sample

    基本业务:一个事件发生后,影响到多个国家,这个事件也会被定一个事件类型(这里简化为type1,2,3),处理这个事件花费多长时间. 我们的事实表就记录这个事情,相对应的我们设计两个维表,一个是国家,一 ...

  5. Redis安装,mongodb安装,hbase安装,cassandra安装,mysql安装,zookeeper安装,kafka安装,storm安装大数据软件安装部署百科全书

    伟大的程序员版权所有,转载请注明:http://www.lenggirl.com/bigdata/server-sofeware-install.html 一.安装mongodb 官网下载包mongo ...

  6. 如何避免测试人员提交重复的Bug

    我们在软件测试过程中,由于不同人员测试同一个项目,所以往往会出现Bug重复提交情况,导致对整个项目和人员产生影响: 浪费测试人员时间和精力,从而影响测试进度 浪费开发人员重复看Bug时间 若开发人员由 ...

  7. Python版任意进制转换

    def decimalToAny(num,n): baseStr = {10:"a",11:"b",12:"c",13:"d&qu ...

  8. ViewPager -- Fragment 切换卡顿 性能优化

    当ViewPager切换到当前的Fragment时,Fragment会加载布局并显示内容,如果用户这时快速切换ViewPager,即 Fragment需要加载UI内容,而又频繁地切换Fragment, ...

  9. 了解了这些才能开始发挥jQuery的威力(转)

    链接:http://www.cnblogs.com/dolphinX/archive/2013/10/08/3347677.html 由于当前jQuery如此的如雷贯耳,相信不用介绍什么是jQuery ...

  10. Mac 使用SSH远程登录

    一.打开ssh Mac Terminal是自带SSH的,可以用whereis来看看: $ whereis ssh 但是在现有进程中找不到ssh对应的进程: $ ps aux | grep ssh ap ...