tcpip详解卷阅读笔记(4)TCP
tcpip协议详解,pdf

竭诚为您提供优质文档/双击可除tcpip协议详解,pdf篇一:tcpip详解-卷一-协议-3.11小结3.11小结本章开始描述了ip首部的格式,并简要讨论了首部中的各个字段。
我们还介绍了ip路由选择,并指出主机的路由选择可以非常简单:如果目的主机在直接相连的网络上,那么就把数据报直接传给目的主机,否则传给默认路由器。
在进行路由选择决策时,主机和路由器都使用路由表。
在表中有三种类型的路由:特定主机型、特定网络型和默认路由型。
路由表中的表目具有一定的优先级。
在选择路由时,主机路由优先于网络路由,最后在没有其他可选路由存在时才选择默认路由。
ip路由选择是通过逐跳来实现的。
数据报在各站的传输过程中目的ip地址始终不变,但是封装和目的链路层地址在每一站都可以改变。
大多数的主机和许多路由器对于非本地网络的数据报都使用默认的下一站路由器。
a类和b类地址一般都要进行子网划分。
用于子网号的比特数通过子网掩码来指定。
我们为此举了一个实例来详细说明,即作者所在的子网,并介绍了变长子网的概念。
子网的划分缩小了internet路由表的规模,因为许多网络经常可以通过单个表目就可以访问了。
接口和网络的有关信息通过ifconfig和netstat命令可以获得,包括接口的ip地址、子网掩码、广播地址以及mtu等。
在本章的最后,我们对internet协议族潜在的改进建议—下一代ip进行了讨论。
习题3.1环回地址必须是127.0.0.1吗?3.2在图3-6中指出有两个网络接口的路由器。
3.3子网号为16bit的a类地址与子网号为8bit的b类地址的子网掩码有什么不同?3.4阅读RFc1219[tsuchiya1991],学习分配子网号和主机号的有关推荐技术。
3.5子网掩码255.255.0.255是否对a类地址有效?3.6你认为为什么3.9小节中打印出来的环回接口的mtu要设置为1536?3.7tcp/ip协议族是基于一种数据报的网络技术,即ip 层,其他的协议族则基于面向连接的网络技术。
《图解TCPIP》读书笔记

《图解TCPIP》读书笔记一.写在前面昨天晚上读完《图解TCP/IP》后就想,应该和TCP/IP协议簇的理论和通信过程做个了断,给自己写一篇读书笔记吧,坐到电脑面前,又深感无力,因为我深知自己没有能力用一篇简短的笔记,来描述图解TCP/IP讲了什么。
那我只能就【第一次阅读图解TCP/IP】给我带来了什么来做一次笔记,当然希望将来能抽出时间,阅读第二遍。
和《TCP/IP详解》相比,实在的说,去年根本看不懂详解,根本看不懂....,但是图解这本书,对于有一定网络基础的人来说,看了真的会感到豁然开朗。
就像学C#的时候,读一读CLR的感觉。
比如从前写socket的时候,开始我想象不到socket是一个什么样的概念,也不明白为什么说它是抽象层。
我也不能彻底理解,websocket和socket的区别,两个层面的东西嘛。
我也曾不能理解,http报文如何通过并利用TCP/IP协议簇的一系列协议从上游到下游,即使在阅读了《图解HTTP》后,很多内容也是非常疑惑的。
甚至连在学校学的数电模电传递高低电压,也没能被我联想到物理层上。
在读书的过程中,自己会挑一些印象深刻的,和对自己比较重要的部分截图到有道云笔记,每次再翻开书的时候,先把之前的截图笔记撸两眼。
二.什么是协议?如何通信?协议就是这P那P的Protocol,无论是OSI七层模型还是TCP/IP 四层模型,上下层之间的交互所遵循的约定叫做【接口】,同一层之间所遵循的约定叫做【协议】,所以你可以说TCP是传输层协议,HTTP是网络层协议,你使用Socket 一套API调用TCP进行通信叫做调用API接口,还有我们最常见的Web请求,使用的叫做Http【协议】,为什么不叫做Http【接口】,因为其通信属于在应用层到应用层,使用的叫做,各自通过【接口】逐层处理报文数据->TCP数据段->IP数据包->链路数据帧->物理比特位,在流经各层接口时,附带上该层的首部,以便在到达目标时,再由各层逐渐剥去首部,恢复原有高层次的数据表现形式,比如数据报。
TCPIP笔记

以太网驱动程序首先根据以太网首部中的“上层协议”字段确定该数据帧的有效载荷(payload,指除去协议首部之外实际传输的数据)是IP、ARP 还是RARP 协议的数据报,然后交给相应的协议处理。
假如是IP 数据报,IP 协议再根据IP 首部中的“上层协议”字段确定该数据报的有效载荷是TCP、UDP、ICMP 还是IGMP,然后交给相应的协议处理。
假如是TCP 段或UDP 段,TCP 或UDP 协议再根据TCP 首部或UDP 首部的“端口号”字段确定应该将应用层数据交给哪个用户进程。
IP 地址是标识网络中不同主机的地址,而端口号就是同一台主机上标识不同进程的地址,IP 地址和端口号合起来标识网络中唯一的进程。
注意,虽然IP、ARP 和RARP 数据报都需要以太网驱动程序来封装成帧,但是从功能上划分,ARP 和RARP 属于链路层,IP 属于网络层。
虽然ICMP、IGMP、TCP、UDP 的数据都需要IP 协议来封装成数据报,但是从功能上划分,ICMP、IGMP 与IP 同属于网络层,TCP 和UDP 属于传输层。
其中的源地址和目的地址是指网卡的硬件地址(也叫MAC 地址),长度是48位,是在网卡出厂时固化的。
用ifconfig 命令看一下,“HWaddr 00:15:F2:14:9E:3F”部分就是硬件地址。
协议字段有三种值,分别对应IP、ARP、RARP。
帧末尾是CRC 校验码。
注意到源MAC 地址、目的MAC 地址在以太网首部和ARP 请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。
硬件类型指链路层网络类型,1为以太网,协议类型指要转换的地址类型,0x0800为IP 地址,后面两个地址长度对于以太网地址和IP 地址分别为6和4(字节),op 字段为1表示ARP 请求,op字段为2表示ARP 应答。
TCPIP详解学习笔记

TCP/IP详解学习笔记(1)-基本概念TCP/IP详解学习笔记(2)-数据链路层TCP/IP详解学习笔记(3)-IP协议,ARP协议,RARP协议TCP/IP详解学习笔记(4)-ICMP协议,ping和TracerouteTCP/IP详解学习笔记(5)-IP选路,动态选路,和一些细节TCP/IP详解学习笔记(6)-UDP协议TCP/IP详解学习笔记(7)-广播和多播,IGMP协议TCP/IP详解学习笔记(8)-DNS域名系统TCP/IP详解学习笔记(9)-TCP协议概述TCP/IP详解学习笔记(10)-TCP连接的建立与中止TCP/IP详解学习笔记(11)-TCP交互数据流,成块数据流TCP/IP详解学习笔记(12)-TCP的超时与重传TCP/IP详解学习笔记(13)-TCP坚持定时器,TCP保活定时器TCP/IP详解学习笔记(1)-基本概念为什么会有TCP/IP协议在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别。
就好像圣经中上帝打乱了各地人的口音,让他们无法合作一样。
计算机使用者意识到,计算机只是单兵作战并不会发挥太大的作用。
只有把它们联合起来,电脑才会发挥出它最大的潜力。
于是人们就想方设法的用电线把电脑连接到了一起。
但是简单的连到一起是远远不够的,就好像语言不同的两个人相互见了面,完全不能交流信息。
因而他们需要定义一些共通的东西来进行交流,TCP/IP就是为此而生。
TCP/IP不是一个协议,而是一个协议族的统称。
里面包括了IP协议,IMCP协议,TCP协议,以及我们更加熟悉的http、ftp、pop3协议等。
电脑有了这些,就好像学会了外语一样,就可以和其他的计算机终端做自由的交流了。
TCP/IP协议分层提到协议分层,我们很容易联想到ISO-OSI的七层协议经典架构,但是TCP/IP协议族(五层架构)的结构则稍有不同。
如图所示:ISO-OSI的七层协议架构TCP/IP协议族应用层Application (X.400, FTAM, VT)应用层Application (SMTP, TELNET, FTP)PresentationSessionTransport传输层Transport(Transmission ControlProtocol)Network网络层Internet(Internet Protocol)Data Link数据链路层NetworkInterfacePhysical物理层HardwareTCP/IP协议族按照层次由上到下,层层包装。
【TCPIP】TCP详解笔记

【TCPIP】TCP详解笔记⽬录前⾔本笔记记录 TCP/IP 中的 TCP 理论。
包括三次握⼿、四次挥⼿、状态变迁、慢启动、快重传等等。
《TCP/IP详解》⼀共三卷,其中卷⼆、卷三更多偏重于编程细节,⽽卷⼀更多偏重于基础原理。
后⾯再发布个⽀持处理多线程并发及客户端数量限制的TCP服务端+TCP客户端例程。
17. TCP 传输控制协议17.1 引⾔17.2 TCP 服务TCP提供⼀种⾯向连接的、可靠的字节流服务。
TCP通过下列⽅式来提供可靠性:应⽤数据被分割成TCP认为最适合发送的数据块。
由 TCP传递给IP的信息单位称为报⽂段或段(segment)。
当TCP发出⼀个段后,它启动⼀个定时器,等待⽬的端确认收到这个报⽂段。
如果不能及时收到⼀个确认,将重发这个报⽂段。
当TCP收到发⾃TCP连接另⼀端的数据,它将发送⼀个确认。
这个确认不是⽴即发送,通常将推迟⼏分之⼀秒。
TCP将保持它⾸部和数据的检验和。
这是⼀个端到端的检验和,⽬的是检测数据在传输过程中的任何变化。
如果收到段的检验和有差错, TCP将丢弃这个报⽂段和不确认收到此报⽂段(希望发端超时并重发)。
TCP报⽂段作为 IP 数据报来传输,⽽IP数据报的到达可能会失序,因此TCP报⽂段的到达也可能会失序。
如果必要,TCP将对收到的数据进⾏重新排序,将收到的数据以正确的顺序交给应⽤层。
IP数据报会发⽣重复,TCP的接收端必须丢弃重复的数据。
TCP还能提供流量控制。
TCP连接的每⼀⽅都有固定⼤⼩的缓冲空间。
TCP的接收端只允许另⼀端发送接收端缓冲区所能接纳的数据。
(窗⼝)字节流服务(byte stream service):两个应⽤程序通过TCP连接交换8 bit字节构成的字节流。
TCP不在字节流中插⼊记录标识符。
17.3 TCP的⾸部视图:端⼝:每个TCP段都包含源端和⽬的端的端⼝号,⽤于寻找发端和收端应⽤进程。
这两个值加上IP⾸部中的源端IP地址和⽬的端IP地址唯⼀确定⼀个TCP连接。
TCPIP学习(四)TCP缓冲区大小及限制

/ysu108/article/details/7764461这个问题在前面有的部分已经涉及,这里在重新总结下。
主要参考UNIX网络编程。
(1)数据报大小IPv4的数据报最大大小是65535字节,包括IPv4首部。
因为首部中说明大小的字段为16位。
IPv6的数据报最大大小是65575字节,包括40字节的IPv6首部。
同样是展16位,但是IPv6首部大小不算在里面,所以总大小比IPv4大一个首部(40字节)。
(2)MTU许多网络有一个可由硬件规定的MTU。
以太网的MTU为1500字节。
有一些链路的MTU 的MTU可以由认为配置。
IPv4要求的最小链路MTU为68字节。
这允许最大的IPv4首部(包括20字节的固定长度部分和最多40字节的选项部分)拼接最小的片段(IPv4首部中片段偏移字段以8个字节为单位)IPv6要求的最小链路MTU为1280字节。
(3)分片(fragmentation)当一个IP数据报从某个接口送出时,如果它的大小超过相应链路的MTU,IPv4和IPv6都将执行分片。
这些片段在到达终点之前通常不会被重组(reassembling)。
IPv4主机对其产生的数据报执行分片,IPv4路由器则对其转发的数据报进行分片。
然后IPv6只有主机对其产生的数据报执行分片,IPv6路由器不对其转发的数据报执行分片。
IPv4首部的“不分片”(do not fragment)位(即DF位)若被设置,那么不管是发送这些数据报的主机还是转发他们的路由器,都不允许对它们分片。
当路由器接收到一个超过其外出链路MTU大小且设置了DF位的IPv4数据报时,它将产生一个ICMPv4“destination unreachable,fragmentation needed b ut DF bit set”(目的不可到达,需分片但DF位已设置)的出错消息。
既然IPv6路由器不执行分片,每个IPv6数据报于是隐含一个DF位。
《TCPIP详解》读书笔记

《TCPIP详解》读书笔记1. ⽹络协议的分层,有四个层次,从下向上分别是:链路层:也称作数据链路层或⽹络接⼝层。
主要处理物理接⼝的细节⽹络层:也称作互联⽹层,处理分组在⽹络中的活动。
在TCP/IP协议族中⽹络层协议包括IP、ICMP和IGMP。
运输层:为两台主机上的应⽤程序提供端到端的通信。
在TCP/IP协议族中有两个不同的传输协议,TCP和UDP。
应⽤层:负责处理特定的应⽤程序细节,TCP/IP的实现都会提供Telnet、FTP、SMTP、SNTP等通⽤应⽤程序。
其中⽹络层和运输层的最⼤区别是:⽹络层(IP)提供点到点的服务,运输层(TCP、UDP)提供端到端的服务。
2.在TCP/IP协议族中,IP提供不可靠的服务,尽可能快的把分组从源节点送到⽬的节点,不提供任何可靠性保证。
TCP在IP层之上,采⽤了超时重传、发送和接收端到端的确认分组机制,提供了可靠的服务。
3.应⽤程序使⽤TCP传送数据时,数据被送⼊协议栈中,逐个通过每⼀层直到被当做⼀串⽐特流送⼊⽹络。
每⼀层对收到的数据都增加⼀些⾸部信息(有时还增加尾部信息)。
UDP数据与TCP数据基本⼀致。
唯⼀的不同是UDP传给IP的信息单元称作UDP数据包,⽽且UDP⾸部为8字节。
4.IP提供不可靠、⽆连接的数据报传输服务:不可靠:不能保证IP数据报能成功到达⽬的地。
简单的错误处理算法,丢弃数据报,发送ICMP消息给信息源。
⽆连接:IP不维护任何关于后续数据报的状态信息。
每个数据报的处理是相互独⽴的。
数据报可以不按发送顺序接收。
5.TCP通过以下⽅式提供可靠性:a.应⽤数据被分割成TCP认为最适合发送的数据块。
UDP应⽤程序产⽣的数据报长度保持不变。
b.发出⼀个段后,启动⼀个定时器等待⽬的端确认收到该报⽂段,如未能及时收到确认,将重发报⽂段。
c.当TCP收到另⼀端的数据,将发送⼀个确认(通常推迟⼏分之⼀秒)。
d.TCP将保持它⾸部和数据的校验和。
如果收到的校验和有差错,TCP将丢弃这个报⽂段且不发送收到确认。
C#基础知识之图解TCPIP》读书笔记

C#基础知识之图解TCPIP》读书笔记⼀、⽹络基础知识1、计算机使⽤模式的演变2、协议协议就是计算机与计算机之间通过⽹络实现通信事先达成的⼀种“约定”。
这种“约定”使那些由不同⼚商的设备、不同的CPU以及不同的操作系统组成的计算机之间,只要遵循相同的协议就能够实现通信。
反之,如果使⽤的协议不同,就⽆法通信。
3、分组交换分组交换是将⼤数据分割为⼀个个叫做包(Packet)的较⼩单位进⾏传输的⽅法。
这⾥所说的包,就如同我们平常在邮局⾥见到的邮包。
分组交换就是将⼤数据分装为⼀个个这样的邮包交给对⽅。
4、协议分层与OSI参考模型(1)协议分层就如同计算机软件中的模块化开发,OSI参考模型的建议是⽐较理想化的。
OSI是Open System Interconnection的缩写,意为开放式系统互联。
(ISO)制定了OSI模型,该模型定义了不同计算机互联的标准,是设计和描述计算机⽹络通信的基本框架。
OSI模型把的⼯作分为7层,分别是、、⽹络层、、、和。
(2)OSI参考模型中每个层的作⽤:(3)7层通信实例:假设主机A的⽤户A要给主机B的⽤户B发送⼀封电⼦邮件:发送⽅从第7层、第6层到第1层由上⾄下按照顺序传输数据,⽽接收端则从第1层、第2层到第7层由下⾄上向每个上⼀级分层传输数据。
每个分层上,在处理由上⼀层传过来的数据时可以附上当前分层的协议所必须的“⾸部”信息。
然后接收端对收到的数据进⾏数据“⾸部”与“内容”的分离,再转发给上⼀分层,并最终将发送端的数据恢复为原装。
⼆、TCP/IP基础知识TCP(Transmission Control Protocol)和IP(Internet Protocol)是互联⽹的众多通信协议中最为著名的。
1、 TCP/IP的背景及历史2、TCP/IP标准化(1)具体含义,很多⼈都会认为TCP/IP是指TCP与IP两种协议,实际⽣活中有时也确实就是指这两种协议。
但是,很多情况下,它只是利⽤IP进⾏通信时所必须使⽤到的协议群的统称。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/net/201201/116442.html最后终于来到了大块头TCP协议,为了给应用层提供可靠的传输服务,tcp协议设计了各种机制以实现丢包、重发、乱序、链路传输错误等传输过程中可能出现的错误。
1. TCP协议概述我们首先来看一下TCP协议的首部,它将给收发两端提供怎样的信息:与UDP一样,TCP报头的前8个字节也是源和目的端的端口号。
<源ip地址,源端口号,目的ip地址,目的端口号>(即一个socket pair)确定一条tcp连接。
序列号用来标识从TCP发端向TCP收端发送的数据字节流,它表示在这个报文段中的第一个数据字节。
反过来,确认序列号是表示TCP发端期望从TCP收端收到的下一个字节(好像说得不是很清楚,后面再说)。
首部长度给出首部中32bit字的数目,跟IP首部一样,TCP最多有60字节的首部。
接下来是6个标志比特,它们中的多个可以被同时设置为1:URG:紧急指针有效,与后面的紧急指针结合起来ACK:确认序号有效PSH:接收方尽快将这个报文段交给应用层RST:重建连接SYN:同步序号用来发起一个连接FIN:发端完成发送任务,将要关闭连接检验和的计算方法和UDP中的检验和一样,也要加上伪首部,也要填充奇数字节,与UDP不同的是,TCP强制要求计算检验和,而UDP的检验和是可选的。
窗口大小表明接收端当前的接收能力,以字节为单位,16位窗口限制了最大值为65535字节,在选项字段中,有一个窗口刻度选项,允许这个值按比例放大。
紧急指针是一个正的偏移量,和序号中的值相加表示紧急指针最后一个字节的序号。
选项字段可以包括最长报文大小(MSS),这是最常见的可选字段。
每个连接方通常都在通信的第一个报文段中指明这个选项,表明本端所能接收的最大长度的报文段;还有上面我们提到的窗口扩大选项以及时间戳选项,我们将在后面看到时间戳选项的作用。
这里摘录一段话来描述TCP协议:“TCP可以表述为一个没有选择确认或否认的滑动窗口协议。
我们说TCP缺少选择确认是因为TCP首部中的确认序列号表示发方已经成功收到字节,但还不包含确认序号所指的字节。
当前还无法对数据流中选定的部分进行确认。
例如,如果1~1024字节已经成功收到,下一个报文段中包含序号从2049~3072的字节,收端并不能确认这个新的报文段。
它所能做的就是发回一个确认序号为1025的ACK。
它也无法对一个报文进行否认。
例如,如果收到包含1025~2048字节的报文段,但它的检验和错,TCP收端所能做的就是发回一个确认序号为1025的ACK。
”这段话也好很地解释了前面提到的确认序列号的问题。
2. 连接的建立与终止接下来就是著名的tcp建立连接的三次握手了。
用时间序列图来表示最清楚不过了:tcp连接的其中一方发起主动连接,它填写目的端口和源端口号,初始化序列号,设置SYN位,并设置了mss选项,将该TCP段发给连接的另一方。
另一方收到tcp段后,与主动连接方做了同样的事情,同时携带ACK,把对主动连接方的初始序号加1填入确认序列号字段,发送给主动连接方。
主动连接方向被动连接方发去一个ack,连接由此建立。
图中还演示了连接关闭的过程,终止一个连接需要四次握手。
任何一方在最后的发送数据段中设置FIN位来终止这个方向的连接。
当一端收到一个FIN,它必须通知应用层另一端已经终止了那个方向的数据传输,也就是说,不再会有数据从那个方向传来,但它仍然能够发送数据,收到FIN方回复一个ack。
由图我们还可以看到,SYN和FIN各占用了一个序号。
图中的端口A、B还让我们想起一个问题,如果不存在用户进程在监听端口B (即端口B没有打开)时,主机A将会收到什么呢?在UDP中,发送端将收到一份ICMP端口不可达报文,那么在TCP连接中呢?TCP使用复位,即在回应发送端的TCP 段中设置了RST位,携带ack主动发送端的确认序列号,自己的序列号为0.发送端收到这样的tcp段后,即知道连接被拒绝了。
那如果主机B根本就不存在呢?这时主机A将过一段时间再发送一个SYN到主机B请求连接,一般建立一个连接的最长时间限制为75秒。
如果一方已经关闭或导演终止而另一方却不知道,我们将这样的TCP连接称为半打开的。
比方说在主机A(客户端)上运行telnet程序,通过它和主机B(服务器)连接,由于突然停电,主机A没有向主机B的telnet端口发送FIN消息,结果主机B就以为与主机A的连接还在。
主机A重新启动后再次与主机B连接将会启动新的服务器程序,这样将会导致主机B上产生很多半打开的TCP连接。
如果是服务器主机B突然当掉了,而客户端A并不知道,它继续向主机B发送数据,假如主机B很快恢复了,然而先前的所有连接信息都丢失了,收到来自主机A的消息时,它回复以RST消息(相当于没有端口在监听)。
TCP支持同时打开或同时关系,不过同时打开将经历4次握手。
下面是TCP的状态变迁图(很难画,于是决定截图):状态图中比较重要的一点就是,主动关闭方在收到对方的对自己FIN的ACK以及对方的FIN后,进入一个状态叫TIME_WAIT,这种状态也称为2MSL等待状态。
每个TCP 实现必须选择一个报文段最大生存时间MSL(Maximum Segment Lifetime),它是任何报文段被丢弃前在网络内的最长时间。
对于一个具体实现所给定的MSL值,处理的原则是:当TCP执行一个主动关闭,并发回最后一个ACK,该连接必须在TIME_WAIT 状态停留的时间为2倍的MSL,以防这个ACK丢失的时候,可以重发一个ACK(对应另一端收不到ACK重发最后的FIN消息)。
这种2MSL等待的另一个结果是这个TCP 连接在2MSL等待期间,定义这个连接的插口(客户的IP地址和端口号,服务的IP地址和端口号)不能再被使用,这个连接只能在2MSL结束后才能被使用。
(书中说事实上很多TCP实现比这个要求还要更严格,在2MSL等待期间,插口中使用的本地端口在默认情况下不能再被使用。
)前面提到TCP的选项,下图是这些选项的格式:nop选项用于填充其他选项使其以4个字节对齐,如下面这个选项:<mss 512, nop, wscale 0, nop, nop, timestamp 146647 0>第一个nop填充窗口扩大选项,第二三个nop填充时间戳选项。
3. TCP的交互数据流(经受延时的确认、nagle算法)、成块数据流(慢启动)建立完连接后,两台主机开始进行数据的传输。
传输的数据可以分成两种,一种是交互式数据的传输,如通过telnet发送指令;一种是大量数据的传输,如通过ftp传输文件。
TCP显然需要同时能够处理这两种类型的数据,但使用的算法有所不同。
我们在telnet客户端键入一个字符时,字符被传输到服务器,服务器发来对该字节的确认;接着服务器发回这个字节,以回显到客户端的屏幕上,客户端又要回复一个确认。
也就是说,我们在一个远程终端上发送一个字符,竟然产生了4个报文段的交互。
经受时延的确认是这样一种机制:接收到数据的一端接收完数据后并不立刻回复一个确认,而是设定一个定时器,以便在定时器复位之前将要传输的数据携带这个确认一起发送过去;当然如果定时器复位时还没有数据要传输,就会单独发送一个ack。
这就是所谓的“经受时延的确认”。
这种方法对上面提到的过程产生影响是,服务器把回显的数据跟确认一起发送回客户端,4个报文段变成了3个报文段。
为了发送一个字节,我们产生了一个41字节长的分组,这在广域网上,可能会增加拥塞出现的可能。
Nagle算法要求一个TCP连接上最多只有一个未被确认的未完成的分组,在该分组的确认到达之前不能发送其他的小分组,相反,TCP收集这些少量的分组,并在确认到来时以一个分组的方式发出去。
但是这种算法对交互性很强的应用来说不是很合适,会有明显的时延。
对于成块的数据流,TCP更应该关注的是流量的控制。
发送端有发送缓冲区(即从应用程序到tcp),接收端有接收缓冲区,并不是接收到的数据马上就能被应用程序处理,如果发送端不断地发送数据,而接收端的缓冲区已经被占满,它必须通知发送端在缓冲区有空隙前,请不要再发送数据了。
在TCP中,缓冲区被形象地比喻成一个可以滑动的窗口,TCP通过一些算法来根据窗口的大小发送数据。
这是端到端的。
还有另外一种情况,就是,当发送方和接收方之间存在多个路由器和速率较慢的链路时,就有可能出现一些问题,一些中间路由器必须缓冲分区,并有可能耗存储器的空间。
因此,连接建立时,双方应该慢慢了解去往对方的路况,然后以一个比较合适的速率大小发送块数据。
TCP支持一种被称为“慢启动”的算法,该算法通过观察到新分组进入网速的速率应该与另一端返回确认的速率相同而进行工作。
慢启动为发送方的TCP增加了另一个窗口:拥塞窗口,当与另一个网络建立TCP 连接时,拥塞窗口被初始化为1个报文段(即另一端通告的报文段大小)。
每收到一个ack,拥塞窗口就增加一个报文段,发送方取拥塞窗口与通告窗口中的最小值作为发送上限。
拥塞窗口是发送方使用的流量控制,而通告窗口是接收方使用的流量控制。
4. TCP的四个定时器对每个连接,TCP管理4个不同的定时器:(1)重传定时器用于等待另一端的确认。
即当发送端发送出数据后,经过一段时间后假如仍然没有收到接收端的确认,那么就重传该数据块。
定时器设计的时间是动态的,并且随着重传的次数的增加而成指数增长。
“动态的”的意思是,重传定时器的值随着网络的状态(用RTT来数学化)而发现改变。
中间有一条计算式子我都没明白是怎么算出来的,这让人很泄气,看了几遍也没看明白,最终就只是知道了有这么一回事。
(2)坚持定时器使窗口大小信息保持不断流动,即使另一端关闭了其接收窗口。
我们知道当接收方的窗口大小为0时,发送方将不能再向它发送数据,直到接收方用一个窗口大小为非0的消息来通告发送端。
可是,万一这个消息丢失了呢?接收方就一直这样等着发送方发来数据,而发送端就一直等着接收方发来窗口大于0的消息,两方就都僵在那里了。
为了避免这种情况的出现,便有了坚持定时器,发送方使用一个坚持定时器来周期性地向接收方查询,以便发现窗口是否已增大。
坚持定时器的定时时间也是指数退避的。
糊涂窗口综合症是指接收方一旦有非0的窗口大小就向发送方通告,从而引起发送端发送少量的数据这样的情况。
可以在任何一方采取措施避免出现这种状况:A. 在接收方,接收方不通告小窗口,一般是除非窗口可以增加一个报文段大小或可以增加接收方缓冲区空间的一半,不然通告窗口大小为0.B. 在发送方,发送方除非收到一个比较大的窗口(如一个报文段小大、是接收方通告窗口大小一半的报文段)或者是还没有未被确认的数据的情况下,才会发送数据。