分类: LINUX
2015-09-10 17:07:23
TCP/IP
TCP/IP是一个协议簇的统称。包括IP协议,IMCP协议,TCP协议,HTTP协议,FTP协议,POP3协议。
应用层:http,ftp
传输层:tcp,udp
网络层:ip(负责对数据加上IP地址和其它的数据以及确定传输的目标)
数据链路层:每个层次的待传输的数据加入一个以太网协议头,并进行CRC编码,为最后的数据传输做准备
硬件层:负责网络传输,定义包括网线的置式,网卡的定义。
发送协议的主机自上而下的将数据按照协议封装,而接受数据的主机按照协议从得到的数据包解开,最后拿到数据,即是栈。也称TCP/IP协议栈。
协议的基本定义:ip地址,域名系统,RFC(TCP/IP协议的标准文档),端口号(port),应用编程接口(socket和TLI)
数据链路层:
1. 为IP模块发送和接受IP数据报;
2. 为ARP模块发送ARP请求和接受ARP应答;
3. 为RARP发送RARP请求和接受RARP应答。
ARP(地址解析协议):是IP地址换成MAC地址的一种协议
RARP(逆地址解析协议)
数据链路层的协议还有很多,比如以太网协议,和一些不太常见的令牌环,还有FDDI,以及PPP协议(ADSL宽带),及loopback协议。
1. 以太网的IP数据报封装在RFC894中定义,而IEEE802网络的IP数据报封装在1042中定义。
2. 一台主机一定能发送和接受RFC894定义的数据报。
3. 一台主机可以接受RFC894和RFC1024的封装格式的混合数据报。
4. 一台宿主机也许能发送RFC1042数据报。如果主机能同时发送两种类型的分组数据,那么发送的分组必须是可以设置的,而且默认条件下必须是RFC894分组。
PPP是从SLIP的替代品。他们都提供了一种低俗接入的解决方案,而每种数据链路层协议,都有一个MTU(最大传输单元)定义,在这个定义下面,如果IP数据报过大,则要进行分片(fragmentation),使得每片都小雨MTU。如果用127.0.0.1测试本机服务器的好坏,走的就是loopback接口。
1. 传给环回地址(一般是127.0.0.1)的任何数据均作为IP输入。
2. 传给广播地址或者多播地址的数据报赋值一份给环回接口,然后送到以太网上,这是因为广播传送和多播传送的定义包含主机本身。
3. 任何传给该主机IP地址的数据均送到环回接口。
IP协议,ARP协议和RARP协议
1. 三个协议位于同一层,ARP用来找到目标主机的Ethernet网卡Mac地址,IP承载要发送的消息,数据链路层可以从ARP得到函数的发送信息,而IP得到要传送的数据信息。
2. IP协议时狠心,TCP,UDP,IMCP,IGCP的数据都已IP数据格式传输,IP是不可靠协议,IP协议没有提供一种数据未传达以后的处理机制,被认为上层协议,TCP/UCP要做的事情。
3. IP协议头,关注8位的TTL字段。这个字段规定该数据报在穿过多少个路由之后会被抛弃,这就体现了IP协议的不可靠性,不保证数据被送达,IP数据包没穿过一个路由,TTL就会减1。当TTL减为0的时候,自动抛弃。这个字段最大值为255。
4. Ip路由选择,当一个IP数据包准备好了的时候,该怎么传递的。
(1) 特殊情况是目的主机和主机相连,主机就不需要寻找路由,直接把数据传递过去。靠ARP协议传递的。
(2) 一般情况是,主机通过若干路由器和目的主机连接,那么路由器就要通过IP包的信息莱维IP报寻找到一个合适的目标来进行传递。比如合适的主机,或者合适的路由器。
(3) 如果IP数据报的TTL为0,则丢弃该IP数据包;
(4) 搜索路由表,优先搜索匹配主机,如果能找到和IP地址完全一致的目标主机,则将这个包法相目标主机。
(5) 搜索路由表,如果匹配主机失败,则匹配同子网的路由器,这需要子网掩码的协助,如果找到路由器,则将该包法相路由器。
(6) 搜索路由表,如果匹配同子网路由器失败,则匹配同网号的路由器,如果找到路由器,九江该包法相路由器。
(7) 搜索路由表,如果以上都失败了,就搜索默认路由,如果默认路由存在,则发包。
(8) 如果都失败了,就丢弃该包。
5. 子网寻址 ip地址的定义是网络号+主机号,但是所有主机都要求子网编址。即将主机号细分为子网号和主机号。
6. ARP协议:数据链路层的以太网的协议中,每一个数据报都有一个MAC地址头,ARP协议是用来使得IP包知道这个MAC地址的。它是一种解析协议,主机开始完全不知道这个IP对应的是哪个主机的哪个接口,当主机要发送一个IP包的时候,会首先查一下自己的ARP告诉缓冲。(IP-MAC地址对应表缓冲),如果查不到,主机向网络发送一个ARP协议广播包。这个广播包里面就有待查询的IP地址。而直接受到这份广播的包的所有主机都会查询自己的IP地址。如果有符合的。就准备一个包含自己MAC地址的ARP包传送给发送ARP包传送给ARP广播的主机,而广播主机拿到ARP包会更新自己的ARP缓存(IP-MAC对应表)。发送广播的主机会用心的ARP缓存数据准备好数据链路层的数据包发送。
7. ICMP协议:网络控制报文协议,保证数据送达。大明湖传送IP数据包发送错误,比如主机不可达,路由不可达,ICMP协议将会把错误信息封包,然后传送回给主机,给主机一个处理错误的机会,这样就能保证在IP层以上的协议时可能做到安全的原因。ICMP数据报由8bit的错误类型和8bit的代码和16bit的校验和组成。前16bit就组成了ICMP所要传递的信息。
8. 在大多数情况下,错误的包会产生ICMP报文,但在特殊请款下,不产生ICMP错误报文的。
(1) ICMP差错报文不会产生ICMP差错报文(ICMP查询报文,防止ICMP的无限产生和传送)
(2) 目的地址是广播地址或多播地址的IP数据报
(3) 作为链路层广播的数据报
(4) 不是IP分片的第一片
(5) 源地址不是单个主机的数据报,这就是说,源地址不能为零地址,环回地址,广播地址或多播地址。
(6) ICMP协议分两种,一种是查询报文,一种是差错报文查询报文分以下几种用途:平查询,子网掩码查询(用于无盘工作站在初始化自身的时候初始化子网掩码),时间戳查询(用来同步时间)
9. ping原理:用类型码为0的ICMP发请求,受到请求的主机则用类型码为8的ICMP回应。Ping程序来计算间隔时间,并计算有多少个包被送达。用户就可以判断网络的大致情况。
10. ping还可以看主机到目的主机的路由。ICMP的ping请求数据报在没经过一个路由器的时候,路由器会把自己的IP放在该数据报中。而目的主机则会把这个IP列表赋值到回应ICMP数据包中发回给主机。如果要观察路由,就需要使用工具Traceroute
11. traceroute用来侦测主机到目的主机之间所经路由情况的工具。尽管ping工具可以进行侦测,但由于IP头的限制,Ping不能完全的记录下所要经历的路由器,所以用traceroute。
12. traceroute收到目的主机的IP后,首先发给目的主机一个TTL=1的UDP数据报,经过第一个路由器收到这个数据包后,减一抛弃,同时产生一个主机不可达的ICMP数据报给主机,主机收到这个数据报以后再发一个TTL=2的UDP数据报给目的主机,然后刺激第二跳路由给主机发ICMP数据报,知道找到目的主机。这样traceroute就可以拿到所有的路由器IP,从而避免了IP头只能记录有限路由IP的问题。TCP和UDP协议有一个端口号,而普通的网络程序只监控少数的几个号码比较小的端口,如80,23而traceroute发送的端口号>30000的UDP报。所以到达目的主机的时候,目的主机只能发送一个端口不可达的ICMP数据报给主机,主机街道这个报告后就知道了。
静态IP选项
1. 一个简单的路由表,选路是IP层最重要的一个功能之一。给定一个路由器,可以打印出五种不同的flag
2.首先用IP地址来匹配那些带H标志的DestinationIP地址。
3.如果1失败就匹配那些网络地址
4.如果2是开就发送到Default网关
在配置好网络接口的时候,一个路由就被直接创建好了,也可以手动添加路由,route add命令即可。当IP包在某一个路由器的时候发现没有路由可走,那么该路由就会给源主机发送“主机不可达”或“网络不可达”的ICMP包来报错。一般情况下,操作系统默认是没有路由功能的,需要自己配置。
ICMP的IP重定向报文和路由发现报文。
当IP包在某一个地方转向的时候,都会给发送IP报的源主机一个ICMP重定向报文。而源主机就可以利用这个信息来更新自己的路由表。这样,随着网络通信的逐渐增加,路由表也就越来越晚辈,数据转发的速度也会越来越快。
1. 重定向报文只能由路由器发出。
2. 重定向报文为主机所用,而不能为路由器所用。
在主机引导的时候,一般会发送在网内广播一个路由请求的ICMP报文,而多个路由器则会回应一个路由通告报文,路由本身不定期的在网络内发布路由通告报文,这样,根据这些报文,每一个主机都会有机会建立自己的路由表而实现网络通信,路由器在一份通告本文中可以通告多个地址,并给出每个地址的优先级这个优先级是该IP作为默认路由的等级。
路由器一般在450-600秒的事件间隔发布一次通告,而给定的通告报文的寿命是30分钟,主机在引导的时候会每三秒发送一次请求报文,一旦接受这个通告报文,就停止发送请求报文。
动态选路协议:
1. 前面的选路方法叫做静态选路,即在配置接口的时候,以默认的方式生成路由表项,并通过route来增加表象,或者通过ICMP来增加表项目(通常在出错的情况下),如果都不行,就使用动态选路。
2. 动态选路协议使用动态选路的重要部分,只是使用在路由器之间,相邻路由器之间互相通信,系统(路由选路程序)选择比较合适的路由放在核心路由表中,然后系统就可以根据这个核心路由表找到最合适的网络。即动态选路在系统很新网络外部进行。它只是用一些选路的策略影响路由表。而不会影响最后通过路由表选择路由的那一部分。
3. 选路协议一般包括三大类:
(1) 内部网关协议(IGP),其中RIP是其中最重要的协议
(2) 另一种IGP协议叫做开放最短路径优先(OSPF)协议,用于取代RIP
(3) 早期用于网络骨干网上的IGP协议(HELLO)
Unix选路程序
1. unix上通常由路由守护程序(routed),还有一个gate,gate所要支持的协议比routed多,routed支持RIPv1版本,gate支持RPIv1,v2,BGPv1。
2. RIP路由信息协议
它的定义可以在RFC1058内找到,这种协议使用UDP作为载体(也就是UDP的上层协议)。关心的是RIP中的一个段。叫做度量的端。以一个hop作为计数器的段。这个度量段将最终影响路由表的建立。Routed要承担以下的工作
(1) 给每一个已知的路由表发送rip请求报文,要求其他路由器给出完整的路由表,这种报文的命令字段为1,度量的段为16.(相当于无穷大)
(2) 接受请求,如果接受到刚才的请求,就把自己的完整的路由表交给请求者,如果没有,就吃力IP请求表项,把表象中自己有的部分添加上条数,没有的部分添加上16,然后发给请求者。
(3) 接受回应,更新自己的路由表,使用hop数小的规则。
(4) 定期更新路由表,一般是30S给相邻的路由器发送一次自己的路由表。
(5) 出现的问题是RIP没有子网的概念,环路比较危险,hop数的上限也限制了网络的大小。
(6) 因此很多替代RIPv1的东西就出现了,如RIPv2,OSPF
UDP协议
UDP是传输层协议,和TCP协议处在一个分层,UDP协议不提供超时重传,出错重传机制。
UDP报文头
1. UDP端口号:很多软件都会用UDP协议,所以UDP协议必须通过某个标志用以区分不同的程序所需要的数据包。如果一个程序注册了一个端口号,那么以后的程序都会给这个端口号的UDP包发送,端口号是16bit,理论上有2^16个。
2. UDP校验和:UDP校验和覆盖UDP协议头和数据,这和IP的检验和是不同的。IP协议的检验和只是覆盖IP数据头,并不覆盖所有的数据。UDP和TCP都包含一个伪首部。这是为了计算校验和而设置的。伪首部甚至还包括IP地址这样的IP协议里面都有的信息。目的是让UDP两次检查数据是否已经正确到达目的地,如果发送端没有打开校验和选项,而接收端计算校验和出错,那么UDP数据就会丢掉,不产生任何差错报文。
3. UDP长度:65535字节,但是一般在网络缠讼的时候,不传送那么长的协议(设计MTU的问题),那么就只好对数据分片。UDP协议无需关系IP协议层是怎么对数据分片的。
4. Ip分片:IP层从上层接收数据以后,要根据IP地质来判断从哪个地质发送数据(通过选路),并进行MTU的查询,如果数据大小超过MTU就进行数据分片,数据的分片是对上层和下层透明,而数据也只是到达目的地还会被重新组装,IP层会提供足够的信息进行数据的再组装。
5. 当目标主机的处理速度赶不上数据接收的速度。因为接收主机的IP层缓存会被占满,所以主机就会发出一个溢出的ICMP报文。
6. UDP服务器设计
(1) 客户IP和地址:服务器必须要有过滤广播地址的能力
(2) 服务器必须有根据客户IP地址和端口号判断数据报是否合法的能力
(3) 服务器通常没一个端口号都会和一块输入缓冲区对应。采用先进先出的原则,难免会发生溢出。这样UDP会丢弃包,服务器则并不知道这个原则。
(4) 服务器应该限制本地IP地址。
单播,多播,组播,广播
1. 单播就是对特定的主机进行数据传送。目的主机的网络接口可以过滤掉和自己MAC地址不一样的数据。
2. 广播:主机对某一网络上的所有主机发送数据包。这个网络可能是网络,可能是子网,也可能是所有子网。一般ARP或者路由协议RIP都是广播形式发出的。
3. 多播是给一组特定的主机(多播组)发送数据。原理是通过数据链路层进行MAC地址绑定然后进行发送。一个以太网卡绑定了一个多播IP地址后,必定还要绑定一个多播的MAC地址。才能使得其可以像单播那样工作。这个多播的IP和多播的MAC有一个对应的算法。
4. 广播和多播的性质是一样的。路由器会把数据放到局域网里,然后网卡对这些数据进行过滤,只拿到自己打算要的数据,当一个主机运行了一个处理某一多播IP的进程的时候,这个进程会给网卡绑定一个虚拟的多播MAC地址,并做出来一个多播IP,这样,网卡就会让带有这个。
5. IGMP协议在于让其他所有需要知道自己处在哪个多播组的主机和路由器知道自己的状态,一般多播路由器根本不需要知道某一个多播组里面有多少个主机。只知道自己的子网内还有没有处于某个多播组的主机就可以了。多播路由器需要定时的发送IGMP查询,IGMP中各个多播组里面的主机要根据查询来回复自己的状态。路由器来决定由几个多播组,自己要对某一个多播组发送什么样的数据。这种查询回应数据报的TTL一般是1,而且就算出错也不会产生ICMP差错。
TCP保证可靠性的简单工作原理:
1. 应用数据被分割成TCO认为最适合发送的数据块。应用程序产生的数据报长度将保持不变,由TCP传递给IP的信息单位成为报文段或段(segment)。
2. 当TCP发出一个段,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
3. TCP收到发次TP连接另一端的数据,它将发送一个确认,这个确认不是立即发送,通常是推迟几分之一秒。
4. TCP将保持它首部和数据的校验和,这是一个端到端的校验和,目的是检测数据在传输过程中的任何变化,如果收到段的校验和有差错。TP将丢弃这个报文段和不确认收到此报文段。(希望超时重传)
5. 既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序。因此TCP报文段的到达可能会失序。因此,TCP报文段的到达可能会失序。如果必要,TCP将收到的数据进行重新排序。将收到的数据以正确的顺序交给应用层。
6. TCP提供流量控制,TCP连接每一方都有固定大小的缓冲空间,TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。防止快主机导致慢主机的缓冲区溢出。
7. TCP保证可靠性的方式是超时重传。TCP可以用各种ICMP报文来处理,但是并不可靠,最可靠的方式是只要不得到确认,就重新发送数据报,直到得到对方的确认为止。
8. TCP和UDP首部都函数发送,接受端口号,但是TCP的首部信息更多。TCP提供了发送和确认所需要的所有必要的信息。
9. TCP数据发送的过程
(1) 建立连接
(2) 发送方给接收方TCP数据报,然后等待对方的确认TCP数据报,如果没有,就会重发,如果有,就发送下一个数据报。
(3) 接收方等待发送方的数据报,如果得到数据报并检验无误,就发送ACK(确认)数据报,并等待下一个TCP数据报的到来,知道接收到FIN(发送完成数据报)
(4) 终止连接
10. 为了建立TCP连接,系统可能建立一个新的进程或者线程来进行数据的输送。
DNS
DNS负责将FQDN翻译成一个IP,最初的DNS系统使用一个巨大的hosts.txt文件,后期用的是数据库,现在用的是分布式数据库。
DNS是一个巨大的树,最上方有一个无名根数,最下层arpa,com,edugov等,其中arpa是域名反解析树的顶端。网络信息中心(NIS)负责分配顶级域合。一个独立管理的DNS子树叫做zone。DNS是一个分布式的数据库,当数据库发现自己并没有查询所需要的数据的时候,它将这把这个查询转发出去,而转发的目的通常是根服务器。根服务器从上到下层层转发查询。DNS报文定义了一个既可以查询也可以相应的报文格式,对每个段的简单解释如下。最前面的16bit唯一的标示了问题好吗,用于查询端区别自己的查询。接下来的16bit又可以做进一步的细分,标示了报文的性质和一些细节。比如硕士查询报文还是响应报文,需要递归查询与否。(一般服务器都支持递归查询,而且不需要任何设置,BIND就是这样)。
查询问题后面有查询类型(A,NS,CHAME,PTR,HINFO,MX)对于BIND的话,在zong的配置文件里面,每一条记录都记载了各自的类型,比如A就是IP地址,NS就是名字服务器。相应报文可以恢复多个IP,也就是说,域名可以和多个IP地址对应,并且有很多CNAME。
反向协议
正想查询时通过域名查到IP,反向就是IP查到域名,一般用host命令,host ip就可以得到服务器的域名,host domainName就得到IP。一般来说正想查询的域里面做反向查询,就是只有便利整个数据集合,对DNS来说就是便利整个数据库,DNS采用另一棵字数来维护IP到域名的对应表。每个字数的根节点是in-addr.arpa,而一个IP如192.168.11.2所具有的DNS地址就是2.11.168.192.in-addr.arpa即ip倒置,在DNS系统里,一个反向地址对应一个PTR记录,对应A记录,反向查询又叫做指针(PTR)查询。
DNS服务器告诉缓存:
DNS9默认是作为一个高速缓存服务器。将所有的查询都转交到根服务器上。然后得到结果并放在本地的缓冲区,以加快查询速度。ZOND中可以规定缓存的事件,一般是1天。
DNS服务器支持TCP和UDP两种协议的查询方式,默认端口是53,大多数的查询时UDP的,有两种情况用TCP。
1. 当查询数据多大以致产生了数据截断(TC标志为1),这个时候就需要利用TCP的分片能力来进行数据传输。
2. 当主(master)服务器和辅(slave)服务器之间通信,辅服务器要拿到主服务器的zone信息的时候。
TCP/IP的连接建立和中止
TCP建立连接,UCP不用建立所以UDP不考虑分片。
建立:
1. 客户端向服务器申请打开某一端口(SYN段等译1的TCP报文),然后服务器端发回一个ACK报文通知客户端接收报文收到,客户端收到确认报文后再次发送确认报文确认收到服务器端发出的确认报文。
2. TCP有一个概念叫做half-close,TCP连接时全双工的,在关闭连接的时候,必须关闭传和送两个方向上的连接。客户机给服务器一个FIN=1的TCP报文,然后服务器返回给客户端一个确认ACK报文。并且发送一个FIN报文,当客户机回复ACK保温后,连接结束。
3. 最大报文长度在建立连接的时候,通信的双方要互相确认对方的最大报文长度(MSS),一般SYN长度是MTU减去固定IP首部和TCP首部的长度,对于一个以太网,一般可以达到1460字节,如果对于非本地的IP,这个MSS可能只有536字节。而且中间的传输网络的MSS更佳的小的话,这个值还会更小。
4. TCP状态迁移图,包含两部分,服务器的状态迁移和客户端的状态迁移,里面的服务器和客户端不是绝对的,发送数据的是客户端,接受数据的是服务器。
5. CLOSED->SYN_SENT->ESTABLISHED->CLOSED_WAIT->LAST_ACK->CLOSED建立连接时,服务器端在第三次我售后才进行数据交互,关闭连接则是在关闭连接的第二次握手后,关闭后还要等待客户端给出最后的ACK包才能进入初始状态。
6. LISTEN->SYN_SENT,服务器打开连接
7. SYN_SENT->SYN收到,服务器和客户端在SYN_SENT状态下如果收到SYN数据报,则都需要发送SYN的ACK数据报并把自己的状态调整到SYN收到状态,准备进入ESTABLISHED
8. SYN_SENT->CLOSED,在发送超时的情况下,会返回CLOSED状态。
9. SYN_RECEIVE->LISTEN,如果收到RST包,会返回到LISTEN状态
10. SYN_RECEIVE->FIN_WAIT_1,这个迁移时可以不用到ESTABLISHED状态,而可以直接跳转到FIN_WAIT_1状态并等待关闭。
2MSL等待状态:TIME_WAIT等待状态,这个状态幼教2MSL状态,说的是在TIME_WAIT2发送了最后一个ACK数据报以后,要进入TIME_WAIT状态,这个状态就是防止最后一次握手的数据报没有传送到对方那里而准备的。保证双方能正常结束。
但是,插口(IP和端口对,socket)的2MSL状态。使得应用程序在2MSL事件内是无法再次使用同一个插口的。对于客户机无所谓,对于服务程序,如httpd,总使用同一个端口来进行服务,而在2MSL时间内,启动httpd会发生错误。这是服务器就有一个平静事件的概念。过了这个实践才进行下一次连接。
FIN_WAIT_2状态
半关闭状态,在关闭连接时。客户端和服务器两次握手之后,在这个状态下,应用程序还可以接受数据,但无法发送,但有一种情况,客户端处在FIN_WAIT_2状态。服务器则处在WAIT_CLOSE状态,知道应用层来关闭这个状态。
RST,同时打开和同时关闭。RST是另一种关闭连接的方式,应用程序可以判断RST包的真实性(是否为异常终止),同时打开和关闭时两桶特殊的TCP状态,发生概率很小。
TCP交互数据流,成块数据流
建立在TCP协议上的网络协议比较多,telnet,ssh,ftp,http,这些协议按吞吐量可分为两类。
1. 交互数据类型:telnet,ssh,这种类型一般做小流量的数据交互
2. 数据成块模型:ftp,这种类型的协议要求TCP尽量的运载数据,提高数据吞吐量。
3. TCP的交互数据流:TCP采用两个策略来提高发送效率和降低网络负担,一般用捎带ACK和Nagle算法(一次尽量多的发数据),一般在网络速度很快的情况下,用lo接口进行telnet通信,当按下字母键并要求回显的时候,客户端和服务器将经历发送按键数据->服务器发送按键数据的ack->服务器端发送回显数据->客户端发送回显数据的ACK的过程。其中的数据流量是40bit,41bit,41bit,40bit共162bit。
(1) 捎带ACK的放松方式:当主机接收远程主机的TCP数据报之后,通常不马上发送ACK数据包,而是等上一个短暂的时间,如果这段时间里面主机还有发送到远程主机的TCP数据报,那么就把这个ACK数据报”捎带”发送过去,把本来两个TCP数据报整合成一个发送,一般,这个发送时间是200ms。
(2) Nagle算法:当主机A给主机B发送一个TCP数据包并进入等待B的ACK数据报的状态时,TCP的输出缓冲区里面只能有一个TCP数据报,这个数据报不断地手机后来的数据,整合成一个大的数据报,等到B主机的ACK包一到,将这写数据一股脑的发送出去。在编写插口程序时,可以通过TCP_NODELAY来关闭这个算法。
TCP的成块数据流
TCP有16bit的窗口的大小。对于FTP这类数据吞吐量大的,有点延迟也可以的也是支持的。
1. 在解释窗口之前,需要看ACK的应答策略,一般,发送端发送一个TCP数据报,那么接收端就应该收到一个ACK数据报。但实际上并不是这样,发送端将会连续的发送数据尽量填满接收方的缓冲区。而接收方对这些数据只要发送一个ACK报文来回应就可以。即ACK的累积特性。
2. 滑动窗口:即接收方的TCP数据报缓冲区大小的数据。
(1) 窗口合拢:当窗口从左边向右边靠近的时候,这种现象发生在数据被发送和确认的时候
(2) 窗口张开:当窗口的右边沿向走遍移动的时候,发生在接收端处理数据之后
(3) 窗口收缩:当窗口的右边沿向左边移动的时候,不常发生。
(4) TCP用这个窗口,慢慢的从数据左边移动到右边,把处在窗口范围内的数据发送出去。窗口大小通过socket制定,4096并不是理想的窗口,16384可以使吞吐量大大增加。
3. 拥塞窗口:传输的时候出现瓶颈,(比如一定要经过一个slib低速链路)所产生的大量数据堵塞问题。TCP发送方需要确认连接双方的线路的数据最大吞吐量是多少即拥塞窗口。原理:快开始,慢启动
TCP超时和重传
超时重传是TCP保证数据可靠性的机制,原理是发送某一个数据以后开始一个计数器,在一定时间内如果没有得到发送的数据报的ACK报文,那么就得重新发送数据,知道成功为止。
超时时间的计算时超时的核心部分,TCP要求这个算法能大致估计出当前的网络状况,定时太久会造成网络利用率不高,定时太短会造成多次重传,是的网络阻塞。
递推公式:最早的TCP曾经用一个非常简单的公式来估计当前的网络状态
R<-aR+(1-a)M
RTP=Rb
重传时发送数据的大小
1. 慢启动,门限,拥塞窗口(cwnd),慢启动门限(ssthresh)。
2. 算法概要
(1) 对一个给定的连接,初始化cwnd为1个报文段,ssthresh为65535个字节
(2) TCP输出历程的输出不能超过cwnd和接收方通告的窗口大小,拥塞避免时发送方使用的流量控制,而通告窗口则是接收方进行的流量控制。
(3) 当拥塞发生时,ssthresh被设置为当前窗口大小的一半(cwnd和接收方通告窗口大小的最小值,最少为2个报文),如果超时引起了拥塞,则cwnd被设置为1个报文段。(即慢启动)
(4) 当新的数据被对方确认时,增加cwnd,但增加的方法不依赖于我们是否正在进行慢启动或拥塞避免。如果cwnd小雨或等于ssthresh,则进行慢启动,否则进行拥塞避免。
快速重传和快速恢复算法
即一种修补机制,重传发生在超时之后,但如果发送端接收了三个以上的重复ACK的情况下,就意味着数据丢失,需要重传,不需要重传定时器溢出,所以叫快速重传。
1. 当收到第三个重复ACK时,将ssthresh设置为当前拥塞窗口cwnd的一半。重传丢失的报文段。设置cwnd为ssthresh加上3倍的报文段大小。
2. 每收到重复ACK,cwnd增加1个报文段大小并发送1个分组
3. 当下一个确认信数据的ACK到达时,设置cwnd为ssthresh。这个ACK应该在进行重传后的一个往返时间内对步骤1中重传的确认。另外,这个ACK也应该是对丢失分组和收到的第一个重复的ACK之间的所有中间报文段的确认。
TCP坚持定时器,TCP保活定时器
TCP一共有四个定时器,
1. 超时定时器
2. 坚持定时器(用于防止通告窗口为0以后双方互相等待死锁的情况)
3. 保活定时器(处理半开放连接)
4. 2MSL定时器
TCP窗口协议,会引发一种通常叫做糊涂窗口综合症的问题。当客户端通告一个小的非零窗口时。服务器立刻发送小数据给客户端并充满缓冲区。一来二去就会让网络中充满小TCP数据报,影响网络利用率。
1. 接收方不通告小窗口,通常的算法是接收方不通告一个比当前窗口大的窗口,除非窗口可以增加一个报文段大小或者可以增加接收方缓存空间的一般
2. 发送方避免出现糊涂窗口有以下之一才可以发送数据。
(1) 尅发送一个满长度的报文段
(2) 可以发送至少是接收方通告窗口大小一半的报文段
(3) 可以发送任何数据并且不希望接受ACK或者连接上不能使用Nagle算法