计算机网络怎么算原始ip报文校验和的校验和

关于icmp报文中的校验和的计算...类型0x00& 0x00校验和 0x5ca7标识符 0x965c序列号 0x0200data: 24 59 20 4B D3 52 0A 00 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37&
&以上报文中的校验和是怎么算出来的呢?我算了好几遍也没算对.请高手指点一下!先谢谢了!--------------------------------------------------------------我也根据RFC文档做了个计算校验和的函数,在下测试通过C/ codeunsigned short GetCheckSum(unsigned char * p, int pl){
unsigned int sum,
unsigned char ttth,
(int ipl=0;ipl&ipl++)
if(ipl==pl-1)
ttth=p[ipl];
tttl=0x00;
ttth=p[ipl];
tttl=p[ipl];
tp= (ttth&&8)+
sump=(sum & 0xFFFF) + ((sum&&16) &0xFFFF);
re=0xFFFF-((sump & 0xFFFF) + ((sump&&16) &0xFFFF));}1498人阅读
【Computer Networks】(16)
对称加密与非对称加密所谓对称加密,就是加密密钥与解密密钥是相同的密码体制,这种加密系统又称为对称密钥系统。对称加密模型如下图所示:用户A向B发送明文X,但通过加密算法E运算后,就得到密文Y。Y=EK(X)图中所示的加密和解密用的密钥K是一串秘密的字符串(或比特串)。在传送过程中可能出现密文的截获和篡改。B利用解密算法D运算和解密密钥K,解出明文X。解密算法是加密算法的逆运算。在进行解密运算时如果不使用事先约定好的密钥就无法解出明文。Dk(Y)=DK(EK(X))= X&数据加密标准 DES 属于对称密钥密码体制,DES是一种分组密码。在加密前先对整个明文进行分组。每一个组长为 64 位。然后对每一个 64 位 二进制数据进行加密处理,产生一组 64 位密文数据。最后将各组密文串接起来,即得出整个的密文。使用的密钥为 64 位(实际密钥长度为 56 位,有 8 位用于奇偶校验)。& DES 的保密性仅取决于对密钥的保密,而算法是公开的。尽管人们在破译 DES 方面取得了许多进展,但至今仍未能找到比穷举搜索密钥更有效的方法。DES 是世界上第一个公认的实用密码算法标准,它曾对密码学的发展做出了重大贡献。DES之后出现了IDEA(International Data Encryption Algorithm),使用128为密钥,因而更不容易被攻破。&非对称加密就是使用不同的加密密钥与解密密钥,又称为公钥密码体制。现有最著名的公钥密码体制是RSA 体制,它基于数论中大数分解问题的体制,由美国三位科学家 Rivest, Shamir 和 Adleman 于 1976 年提出并在 1978 年正式发表的。在公钥密码体制中,加密密钥(即公钥) PK 是公开信息,而解密密钥(即私钥或秘钥) SK 是需要保密的。加密算法 E 和解密算法 D 也都是公开的。虽然秘钥 SK 是由公钥 PK 决定的,但却不能根据 PK计算出 SK。&公钥加密模型如下:发送者 A 用 B 的公钥 PKB对明文 X 加密(E 运算)后,在接收者 B 用自己的私钥 SKB 解密(D 运算),即可恢复出明文: 解密密钥是接收者专用的秘钥,对其他人都保密。加密密钥是公开的,但不能用它来解密,即 加密和解密的运算可以对调,即 在计算机上可容易地产生成对的 PK 和 SK。从已知的 PK 实际上不可能推导出 SK,即从 PK 到 SK 是“计算上不可能的”。加密和解密算法都是公开的。在公钥密码体制中,似乎只要每个用户都具有其他用户的公钥,就可实现安全通信,其实不然,设想用户A要欺骗用户B,A可以向B发送一份伪造的是C发送的报文,B如何知道这个公钥不是C的呢?这就需要有一个值得信赖的机构——即认证中心CA (Certification Authority),来将公钥与其对应的实体(人或机器)进行绑定(binding)。认证中心一般由政府出资建立。每个实体都有CA发来的证书(certificate),里面有公钥及其拥有者的标识信息。此证书被 CA 进行了数字签名。任何用户都可从可信的地方获得认证中心 CA 的公钥,此公钥用来验证某个公钥是否为某个实体所拥有。有的大公司也提供认证中心服务。数字签名数字签名必须保证以下三点:(1) 报文鉴别——接收者能够核实发送者对报文的签名;(2) 报文的完整性——发送者事后不能抵赖对报文的签名;(3) 不可否认——接收者不能伪造对报文的签名。现在已有多种实现各种数字签名的方法。但采用公钥算法更容易实现。& 为了进行签名,A用其私钥SKA对报文X进行D运算。D运算本来叫做解密运算,虽然还没有对X进行加密,但实际上没关系,因为D运算只是为了得到某种不可读的密文。A把经过D运算得到的密文传送给B。B为了核实签名,用A的公钥进行E运算,还原出明文X。请注意,任何人用A的公钥PKA进行E运算后都可以得出A发送的明文。可见,上图中D运算和E运算不是为了解密和加密,而是为了进行签名和核实签名。下面分析一下为什么数字签名具有上述的三点功能:因为除 A 外没有别人能具有 A 的私钥,所以除 A 外没有别人能产生这个密文。因此 B 相信报文 X 是 A 签名发送的。若 A 要抵赖曾发送报文给 B,B 可将明文和对应的密文出示给第三者。第三者很容易用 A 的公钥去证实 A 确实发送 X 给 B。反之,若 B 将 X 伪造成 X’,则 B 不能在第三者前出示对应的密文。这样就证明了 B 伪造了报文。& 但是上述过程仅对报文进行了签名,却没有加密。因为截获了密文并知道发送者身份的任何人,通过查阅手册即可获得发送者的公钥,因为能知道报文的内容。采用下图所示的方法,就可同时实现秘密通信和数字签名:报文鉴别许多报文并不需要加密但却需要数字签名,以便让报文的接收者能够鉴别报文的真伪。然而对很长的报文进行数字签名会使计算机增加很大的负担(需要进行很长时间的运算。当我们传送不需要加密的报文时,应当使接收者能用很简单的方法鉴别报文的真伪。报文摘要MD(Message Digest)是进行报文鉴别的简单方法。A 将报文 X 经过报文摘要算法运算后得出很短的报文摘要 H。然后然后用自己的私钥对 H 进行 D 运算,即进行数字签名。得出已签名的报文摘要 D(H)后,并将其追加在报文 X 后面发送给 B。B 收到报文后首先把已签名的D(H) 和报文 X 分离。然后再做两件事:(1)用A的公钥对 D(H) 进行E运算,得出报文摘要 H 。(2)对报文 X 进行报文摘要运算,看是否能够得出同样的报文摘要 H。如一样,就能以极高的概率断定收到的报文是 A 产生的。否则就不是。&仅对短得多的定长报文摘要 H 进行数字签名要比对整个长报文进行数字签名要简单得多,所耗费的计算资源也小得多。但对鉴别报文 X 来说,效果是一样的。也就是说,报文 X 和已签名的报文摘要 D(H) 合在一起是不可伪造的,是可检验的和不可否认的。报文摘要算法就是一种散列函数。这种散列函数也叫做密码编码的检验和。报文摘要算法是防止报文被人恶意篡改。可以很容易地计算出一个长报文 X 的报文摘要 H,但要想从报文摘要 H 反过来找到原始的报文 X,则实际上是不可能的。若想找到任意两个报文,使得它们具有相同的报文摘要,那么实际上也是不可能的。MD5(Message-Digest Algorithm 5)已获得了广泛的应用。它对任意长的报文进行运算,然后得出128位的MD5报文摘要代码。另一种标准叫做安全散列算法SHA(Secure HashAlgorithm),它和MD5相似,但码长为160位。SHA比MD5更安全,但计算起来也比MD5要慢些。安全套接层SSLSSL(Secure Socket Layer)为Netscape所研发,用以保障在Internet上数据传输之安全,利用数据加密技术,可确保数据在网络上之传输过程中不会被截取及窃听。SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL可对万维网客户与服务器之间传送的数据进行加密和鉴别,它在双方的联络阶段(也就是握手阶段)对将要使用的加密算法(如DES或RSA等)和双方共享的回话密钥进行协商,完成客户与服务器之间的鉴别。在联络阶段完成之后,所有传送的数据都使用在联络阶段商定的会话密钥。SSL不仅被所有常用的浏览器和万维网服务器所支持,而且也是运输层安全协议TLS(Transport Layer Security)的基础。&在发送方,SSL接受应用层的数据(如HTTP或IMAP报文),对数据进行加密,然后把加了密的数据送往TCP套接字。在接收方,SSL从TCP套接字读取数据,解密后把数据交给应用层。SSL提供一下三种服务:(1)认证用户和服务器,确保数据发送到正确的客户机和服务器;(2)加密数据以防止数据中途被窃取;(3)维护数据的完整性,确保数据在传输过程中不被改变。SSL工作原理的示意图如下:SSHSSH 为Secure Shell 的缩写,SSH为建立在应用层和传输层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。传统的网络服务程序,如:ftp、pop和telnet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,别有用心的人非常容易就可以截获这些口令和数据。而且,这些服务程序的安全验证方式也是有其弱点的,就是很容易受到“中间人”(man-in-the-middle)这种方式的攻击。所谓“中间人”的攻击方式, 就是“中间人”冒充真正的服务器接收你传给服务器的数据,然后再冒充你把数据传给真正的服务器。服务器和你之间的数据传送被“中间人”一转手做了手脚之后,就会出现很严重的问题。通过使用SSH,可以把所有传输的数据进行加密,这样“中间人”这种攻击方式就不可能实现了,而且也能够防止DNS欺骗和IP欺骗。使用SSH,还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替Telnet,又可以为FTP、POP、甚至为PPP提供一个安全的“通道”。&从客户端来看,SSH提供两种级别的安全验证。第一种级别(基于口令的安全验证)只要你知道自己帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,也就是受到“中间人”这种方式的攻击。&第二种级别(基于密匙的安全验证)需要依靠密匙,也就是你必须为自己创建一对密匙,并把公用密匙放在需要访问的服务器上。如果你要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的密匙进行安全验证。服务器收到请求之后,先在该服务器上你的主目录下寻找你的公用密匙,然后把它和你发送过来的公用密匙进行比较。如果两个密匙一致,服务器就用公用密匙加密“质询”(challenge)并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私人密匙解密再把它发送给服务器。用这种方式,你必须知道自己密匙的口令。但是,与第一种级别相比,第二种级别不需要在网络上传送口令。第二种级别不仅加密所有传送的数据,而且“中间人”这种攻击方式也是不可能的(因为他没有你的私人密匙)。但是整个登录的过程可能需要10秒。&SSL与SSH虽然只有一个字母的差别,但是两者不是一个范畴,如果硬要将两者作比较,SSH和SSL的关系可以这么理解, SSH是用SSL协议构建的一个类似telnet的应用,即:SSH = TELNET + SSL。防火墙防火墙是由软件、硬件构成的系统,是一种特殊编程的路由器,用来在两个网络之间实施接入控制策略。接入控制策略是由使用防火墙的单位自行制订的,为的是可以最适合本单位的需要。防火墙内的网络称为“可信的网络”(trustednetwork),而将外部的因特网称为“不可信的网络”(untrusted network)。防火墙可用来解决内联网和外联网的安全问题&防火墙的功能有两个:阻止和允许。“阻止”就是阻止某种类型的通信量通过防火墙(从外部网络到内部网络,或反过来)。“允许”的功能与“阻止”恰好相反。防火墙必须能够识别通信量的各种类型。不过在大多数情况下防火墙的主要功能是“阻止”。&防火墙技术一般分为两类:(1) 网络级防火墙——用来防止整个网络出现外来非法的入侵。属于这类的有分组过滤和授权服务器。前者检查所有流入本网络的信息,然后拒绝不符合事先制订好的一套准则的数据,而后者则是检查用户的登录是否合法。(2)应用级防火墙——从应用程序来进行接入控制。通常使用应用网关或代理服务器来区分各种应用。例如,可以只允许通过访问万维网的应用,而阻止 FTP 应用的通过。&分组过滤是靠查找系统管理员所设置的表格来实现的。表格列出了可接受的、或必须进行阻拦的目的站和源站,以及其他的一些通过防火墙的规则。我们知道,TCP的端口号指出了在TCP上面的应用层服务。例如,端口号23是TELNET,端口号119是USENET,等等。如果在因特网进入防火墙的分组过滤路由器中所有目的端口号为23的分组都进行阻拦,那么所有外单位用户就不能使用TELNET登录到本单位的主机。同理,如果某公司不愿意其雇员在上班时间花费大量的时间去看因特网的USENET新闻,就可将目的端口号为119的分组阻拦住,使其无法发送到因特网。阻拦向外发送的分组很复杂,因为有时它们不使用标准的端口号。例如FTP常常是动态地分配端口号。阻拦UDP更困难,因为事先不容易知道UDP想做什么。许多分组过滤路由器干脆将所有的UDP全部阻拦。应用网关是从应用层的角度来检查每一个分组。例如,一个邮件网关在检查每一个邮件时,要根据邮件的首部或豹纹的大小,甚至报文内容(例如,有没有某些像“导弹”、“核弹头”等敏感词汇)来确定该邮件能否通过防火墙。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:263658次
积分:5599
积分:5599
排名:第3695名
原创:181篇
评论:171条
阅读:9571
阅读:2959
阅读:39965
文章:17篇
阅读:20279
文章:19篇
阅读:29567酷勤网 C 程序员的那点事!
当前位置: >
浏览次数:次
运输层是居于网络层之上,应用层之下。在运输层中,有着两个十分重要的因特网协议:TCP和UDP运输层协议。
运输层协议为运行在不同主机上的应用进程之间提供逻辑通信。而网络层协议是为了两台不同的主机之间提供逻辑通信。
运输层协议是在端系统中而不是在网络路由器中实现的。
运输层中,主要有以下的几个重要的知识点:
多路复用和多路分解
TCP协议的可靠传输机制
TCP协议的流量控制
TCP协议的拥塞控制
TCP协议的连接管理
1. 多路复用和多路分解
多路复用和多路分解是所有计算机网络都需要的。
portsmultiplexing
多路分解是将在运输层收到的报文段中的数据交付到正确的套接字的工作。
多路复用是从源主机的不同套解字中收集数据块,并为每个数据块封装上首部信息(这将在多路分解时使用)从而生成报文段,然后将报文段传递到网络层的工作。
需要注意的是,两台主机中不同的进程间进行通信是通过来进行的。它相当于从网络向进程传递数据和从进程向网络传递数据的门户。
在接收主机中的运输层实际上并没有直接将数据交付给进程,而是通过一个中间的套接字来传递。同一台主机上的所有套接字都具有唯一的标识符。
无连接的多路复用和多路分解
UDP是无连接的。一个UDP套接字是由一个包含目的IP地址和目的端口号的二元组来全面标识的。
如果两个UDP报文段具有不同的源IP/端口号,但具有相同的目的IP/端口号,那么,这两报文段会被送至相同的目的进程。
所以,一个UDP的套接字使用的就是本地的IP和端口号进行标识。这样运输层中收到UDP报文段时,就会根据报文段中的目的IP/端口号向进程投递报文。
面向连接的多路复用和多路分解
TCP是面向连接。一个TCP套接字是由一个四元组(源IP/端口号,目的IP/端口号)来标识的。
这样当一个TCP报文段从网络到达一台主机时,主机使用全部四个值来将报文段定向(多路分解)到相应的套接字。
正是因为TCP是面向连接的,所以需要四个值来标识。不同客户机里面的不同进程都可以跟服务器的一个特定的服务进程建立各自的一条连接。而这每一条连接的两端的套接字都是以四个值进行标识的。
服务器关注连接请求报文段里的这四个值,新创建的连接套接字通过四个值来标识。所有后续到达的报文段,如果它们这四个值都匹配,则被多路分解到这个套接字。
WEB服务器与TCP:
连接套接字与进程之间并非总是有着一一对应的关系。事实上,当今的高性能WEB服务器通常只使用一个进程,但是为每个新的客户机连接创建一个具有新连接的套接字的新线程。
2. UDP协议
UDP其实就是在网络层协议上增加了一点多路复用和多路分解服务以及差错检测功能。
UDP报文结构:
注意,图中的蓝色部分的两个源端口是错误的。正确的是先从左往右:源端口、目的端口。
UDP报文首部真正只具有四个字段,每个字段只有2个字节,所以一共是8个字节。黄色部分的伪首部是用于求检验和字段的。
在计算检验和的时,在UDP用户数据报前增加12个字节的伪首部。伪首部既不向下传送也不向上递交,仅仅是为了计算检验和。
UDP的差错检测是包括数据部分,与IP只检测首部是不同的。
UDP的检验和求法采用的是IP的16位的反码求和。若UDP用户数据报的数据部分不是偶数个字节则填入一个全零字节(这个字节不发送),在接收方,对收到UDP数据报进行16位的反码求和,得到结果如果为全1则无差错。虽然UDP提供差错检测,但不提供差错恢复。
UDP Checksum
UDP的特点:
UDP是无连接的,面向报文的。
UDP是尽最大努力交付。
UDP没有拥塞控制,可能会导致发送放和接收方之间的高丢包率,并挤垮TCP会话,这是一个潜在的严重问题。
UDP首部开销小,只有8个字节。
UDP的注意点:
UDP的检验和是可选的。
UDP的加伪首部去计算检验和的目的确认数据是否正确到达目的地(IP没有接受地址不是本主机的数据和IP没有把应传送给另一高层的数据报传给UDP)。
UDP的检验和计算出来全是0的话,就往检验和字段填充全1,这是在二进制反码计算中是等效的。但如果该字段全0则说明发送端没有做计算。
如果UDP数据报有错,会被悄悄地丢弃。
虽然UDP是无连接,不可靠的协议。但是其占用资源小,速度快,实时性强等优点还是受到很多应用利用。
3. TCP协议
TCP协议是面向连接,提供可靠交付服务,提供全双工通信,面向字节流的。
面向连接是指通信前会在两个主机两个不同的通信进程之间建立一条虚拟的连接(逻辑连接)。
TCP报文结构:
源端口或目的端口(分别2个字节):略。
序号(4个字节):TCP连接中传送的字节流中的每一个字节都按顺序编号。传送的字节流的起始序号必须在连接建立时设置。首部中的序号字段值的是本报文段所发送的数据的第一个字节的序号。例如一报文段序号值为101,数据共有100字节,那么下一报文段序号值就为201。因为序号的大小是[0,2^32 -1],超出了循环从0开始,所以序号是使用mod2^32运算的。
确认号(4个字节):期望收到对方下一个报文段的第一个数据字节的序号。
数据偏移(4位):指出TCP报文段的数据起始处距离TCP首部的起始处有多远。实际上就是指出TCP首部长度。数据偏移的单位是4个字节,而4位二进制的最大值是15,则说明首部最大只能是15*4=60字节。其实选项字段最大只能为40字节。
保留(6位):略。
紧急URG:表明紧急指针子字段有效。
确认ACK:等于1时确认号字段才有效。TCP规定连接建立后所有传送报文度必须把ACK置1。
推送PUSH:表明需要尽快地交付接收应用进程,不再等整个缓存都填满后再向上交付。
复位RST:等于1时表明TCP连接中出现严重差错,必须释放连接再重新建立。
同步SYN:用于连接建立时同步序号的。
终止FIN:用来释放一个连接。
窗口(2个字节):该字段用于流量控制,指示接收方愿意接收的字节数量。因为接收方的接收缓存有限。窗口值是动态变化的。
检验和(2个字节):检验和检查的范围包括首部和数据。
紧急指针(2个字节):指出紧急数据的末尾在报文段中的位置。即使窗口值为零也可以发送紧急数据。
选项(最大可达40个字节):略。
4. TCP协议的可靠传输机制
TCP协议的可靠传输机制主要依靠:
TCP协议规定,接收方对于正确接收到的来自发送方的报文段要给予确认返回报文。该报文中的首部ACK指向接收方期待下一个开始接收的字节。
当发送方发送报文之后,会启动一个倒数计时器(重传超时间隔),计时器为零时,就认为报文可能在网络中丢失,需要重传报文。
那么这个重传超时间隔的值要设为多少呢?
首先,这个值必须大于TCP连接的往返时延(RTT)。
TCP采用的是自适应的方法。设SampleRTT为样本RTT,就是从某报文被发出(即交给IP)到对该报文段的确认被收到之间的时间量。
在任意时刻只为一个已发送但未被确认的报文段估测量,并且仅为传输一次的报文段测量SampleRTT。
可是SampleRTT的值会因为网络的拥塞情况而不段的变化,所以需要一个均值EstimatedRTT:
SampleRTT = (1-a) * EstimatedRTT + a * SampleRTTs
中给出a参考值是0.125。从统计学观点来说,这种平均被称为指数加权移动平均。
另外,测量RTT的变化也是有意义的。所以定义了RTT偏差DevRTT。
DevRTT = (1-b) * DevRTT + b * |SampleRTT - EstimatedRTT|
超时间隔应该是等于大于均值的,而超过的均值的范围值可以利用DevRTT。所以超时间间隔的公式就为:
TimeoutInterval = EstimatedRTT + 4 * DevRTT
超时触发重传存在的另一个问题就是超时周期可能相对较长。这种长超时周期迫使发送方等待很长时间才重传丢失分组。幸运的是,发送方可以通过冗余ACK较好地检测丢包情况。
冗余ACK就是再次确认某个报文段的ACK,而发送方先前已经收到对该报文段的确认。
FastRetransmit
如果TCP发送方接收到相同数据的3个冗余ACK,就认为跟在这个已被确认过3次的报文段之后的报文段已经丢失。一旦收到3个冗余ACK,TCP就执行快速重传。
TCP的差错恢复方法有两种:
回退N步(GBN协议)
选择重传(SR协议)
GBN协议常常被称为滑动窗口协议。
来看一个发送方的示例图:
base是基序号,指示最早的未确认分组的序号。 nextseqnum是下一个序号,指示最小的下一个待发送分组的序号。window size就是窗口大小。
每当收到ACK时,base指针就会变化,整个窗口就会前移。收到一个ACK时仍有未被确认分组,则计时器被重新启动。
如果出现超时,发送方将重传所有已发送但未确认的分组。
在GBN协议中,接收方会丢弃所有失序的分组。即使前面在失序分组前已经有好几个分组正确到达了。
一个单分组的差错或失序就可能引起GBN重传大量分组,许多分组根本没有必要重传。所以,选择重传协议通过让发送方仅重传它怀疑在接收方出错(即丢失或受损)的分组而避免来不必要的重传。
这种按需重传就要求接收方逐个地确认正确接受的分组。
SR协议中:
发送方的中的每个分组必须拥有自己的逻辑定时器,因为超时后只能发送一个分组。可以使用单个硬件定时器模拟多个逻辑定时器的操作。
接收方将确认一个正确接收的分组而不管其是否按序。失序的分组将被缓存,直到一批分组按序接收成功了则交付上层。
由于接收方接收了分组就发送ACK,移动自身的接收窗口,而发送方有可能因为ACK丢失等原因迟迟没收到确认报文以至于窗口不移动。所以,对于SR协议而言,这就意味着发送方和接收方的窗口并不总是一致。
对于SR协议而言,窗口的长度必须小于或等于序号空间大小的一半。因为序号空间是有限的,必须是循环利用的。假如序号空间总大为4,那么4之后会从0循环开始。当窗口大小大于序号空间的一半时,就有可能会出现接收方接收到一个分组到来是不能判断得到这个分组是一个新的分组抑或是一个重传。
可以看到当发送方发送的是重传分组时,接收方是无法判别的。
当窗口的长度必须小于或等于序号空间大小的一半时,前面重传的数据报到达时会被丢弃,因为它的序号不在窗口内。但这里其实有个疑问,2^32大小的序号空间加上流量窗口和拥塞窗口,像不能判断得到这个分组是一个新的分组抑或是一个重传这种情况发生的概率大吗?
5. TCP协议的流量控制
TCP为应用程序提供来流量控制服务,以消除发送方使接收方缓存溢出的可能性。因此,可以说流量控制是一个速度匹配服务,即发送方的发送速率与接收方应用程序的读速率相匹配。
注意:流量控制服务与拥塞控制不同。它们分别是针对不同原因而采取的措施。
TCP协议报文结构中的窗口字段就是用于流量控制的。
首先先来定义几个变量标识:
LastByteRead: 接收方的应用程序从缓存中读出的最后一个字节编号
LastByteRcvd: 从网络到达接收方缓存中的最后一个字节
RcvBuffer: 接收方缓存大小
RcvWindow: 接收方的接收窗口大小
LastByteSent: 发送方最后发送的字节编号
LastByteAcked: 发送方最后接收到ACK的字节编号
由上面的变量可以得出以下的关系式:
LastByteRcvd - LastByteRead &= RcvBuffer
RevWindow = RcvBuffer - ( LastByteRcvd - LastByteRead )
LastByteSent - LastByteAcked &= RevWindow
所以是要将发送方的已发送未确认的分组控制在接收方给出的窗口大小内。考虑到当接收方返回的window值为0时,发送方就不能再进行发送,而发送方不进行发送,当接收方有缓存窗口不为零就无法得知,因为接收方不会主动推送窗口值。所以TCP规定,当发送方收到窗口值为0时的报文,就本地开启一个计时器,时间一到就主动地去发送一个只有一字节的探测报文段,这时候接收方就把新的窗口值加上去ACK报文段进行返回。
6. TCP协议的拥塞控制
IP层不提供显式的网络拥塞反馈,所以TCP必须使用端到端的拥塞控制。
拥塞指的是当前网络的环境。当拥塞发生时,路由器上的缓存就会面临溢出的可能,这样会导致分组在网络中被丢弃,影响通信的质量。
改善网络中的拥塞情况也是起到全局性作用的。
由于是TCP自身实现的拥塞控制,所以就会产死以下的几个问题:
发送方如何去检测当前网络的拥塞情况?
当网络拥塞,会对发送方导致的直接结果是:超时重传和冗余的ACK。自然可以根据这两种情况去判断网络是否有拥塞。
当检测到拥塞的时候,发送方是如何限制发送的速率?
TCP拥塞控制机制让连接的每一端都记录一个额外的变量,即拥塞窗口,表示为CongWin(以字节为单位)。它对一个TCP发送方能向网络中发送流量的速率进行了限制。
结合在TCP中的流量控制RcvWindow。可以得到:
LastByteSent - LastByteAcked &= min( CongWin, RcvWindow)
在一个发送方中未被确认的数据量不会超过CongWin和RcvWindow中的最小值。
在拥塞控制中,采用的是什么算法进行调整发送的速率?
TCP拥塞控制算法有:
加性增(additive-increase),乘性减(multiplicative-decrease)
慢启动(slow start)
对超时事件作出反应
加性增(additive-increase),乘性减(multiplicative-decrease)
加性增的思想是,当检测到网络无拥塞(即有对未确认的数据有ACK到达时),就每收到一个确认就把Congwin增加一个MSS*(MSS/CongWin)。(CongWin=CongWin+MSS*(MSS/CongWin))注:MSS意思是最大报文段长度。
乘性减的思想是,当发送丢包的事件时,CongWin的值会减半。CongWin值也许会持续地减少,但是不能降到低于1个MSS。
TCP拥塞控制协议的线性增长阶段被称为避免拥塞。CongWin值会重复地经历一个升降循环,即重复地线性增长又突然降至一半。所以CongWin的变化会是锯齿状的。
加性增、乘性减的拥塞控制
慢启动(slow start)
TCP连接开始时,CongWin的值初始为1。但发送方在初始阶段不是线性地增长的,而是以指数的形式。即每收到一个ACK,CongWin就会增加一个MSS。(CongWin=CongWin+MSS)
当CongWin&Threshold(阀值)时,TCP就会由慢启动的状态转换到拥塞避免。
slow start
3. 对超时事件作出反应
上面已经说道,TCP是根据超时事件和冗余ACK判断网络拥塞的。
但是TCP的拥塞控制机制对于这两种事件所采取的对策是不一样的。因为冗余ACK的发生,说明还是有一部分的分组能够到达,但是超时事件意味着不能到达。
当发生冗余ACK时,TCP先把CongWin减半(乘性减),然后进行加性增。
当发生超时事件时,TCP会把CongWin当前值的一半记录下来(我们记为Threshold)。然后将拥塞窗口设为1MSS,再以慢启动的形式增长直至CongWin达到Threshold为止。这时再以加性增的形式增长。
这种在收到冗余ACK后取消慢启动阶段的行为称为快速恢复。
最后,针对各种的不同的情况做一个总结:
TCP发送方拥塞控制动作
慢启动(ss)
收到未确认数据的ACK
CongWin=CongWin+MSS,if(CongWin&Threshold)
拥塞避免(ca)
收到未确认数据的ACK
CongWin=CongWin+MSS*(MSS/CongWin)
CongWin=CongWin/2,然后状态变为拥塞避免
Threshold=CongWin/2,CongWin=1MSS,然后状态变为慢启动
7. TCP协议的连接管理
一台主机想要向另一台主机发起TCP通信时需要建立连接,当传输结束之后需要释放连接。
TCP建立连接是通过三次握手。
TCP three-way handshaking
客户端向服务端发送一个特殊的TCP报文段。该报文段不包含应用层数据,但需要把报文段首部的SYN标志位置1。这个报文被称为SYN报文段。除了SYN,还需要加上SEQ字段指示客户端的开始序号。
服务端接收到SYN报文之后,就为该TCP连接分配TCP缓存和变量,并向客户端发送允许连接的报文段。该报文段包含SYN和SEQ,意义同上。但还附带一个ACK指示想要收到的下一个字节。该允许连接的报文段有时被称为SYNACK报文段。
在收到来SYNACK报文段后,客户机也要给该连接分配缓存和变量。这时客户端还会向服务端发送另一个报文段,是对SYNACK报文段进行确认。因为连接已经成功建立,所有该SYN被置0。
一旦建立连接成功,双方就可以互相发送含有数据的报文段,并且这些报文段SYN都置为0。
TCP释放连接是通过四次挥手。
TCP four-way handshake
如图所示,客户端应用进程发出一个关闭连接命令。这会引起客户端TCP向服务端进程发送一个特殊的TCP报文段。这个特色的报文段首部中的FIN比特被置1。当服务接收到该报文段后,就向客户端会送一个确认报文段。这时,TCP连接处于半关闭状态。半关闭指的是客户端已经不能再给服务端发送数据了,但可以接收服务端发过来的数据。数据传送完毕之后,服务端发送其终止报文段,同样FIN被置1。最后客户端对这个服务端的终止报文段进行确认。两台主机的TCP连接成功释放。
注意,如果服务端不需要向客户端传输数据了,那么ack=u+1的这个两个报文是可以结合为一个的。
为什么客户端最后需要等待2MSL呢?
解释一下,MSL意思是报文段最大生存时间(Maximum Segment Lifetime)。它是任何报文段被丢弃前在网络内的最长时间。因为网络层有限制生存时间字段TTL,所以MSL值是有限的,常用可能会30秒,1分钟,2分钟。
为了保证服务端能够接收到客户端的确认报文段,因为服务端在规定时间内收不到会进行重发。
经过2MSL之后可以使本连接持续的时间内产生的所有报文都从网络中消失。
所以,服务端关闭连接要比客户端要快。
关于2MSL还有别的有趣事情,可以参考。
如果因为机器故障而导致连接被中断呢?
TCP设有一个保活计时器。服务端每收到一次客户的数据都会重新设置该计时器。计时器到时之后,服务端会主动发送探测报文,连续几个探测报文没反应的话,服务端就会自动关闭。
文章笔记理论为多,实验部分可能会随着review会更新上去。学习协议建议更多以实践为主。
文章中使用到的图片均来源于网络
& 相关主题:}

我要回帖

更多关于 报文的mac校验 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信