解析tcp协议(西门子tcp协议解析)

      最后更新:2022-11-05 01:00:06 手机定位技术交流文章

      TCP/IP协议是什么

      TCP/IP协议是什么TCP和UDP处在同一层---运输层,但是TCP和UDP最不同的地方是,TCP提供了一种可靠的数据传输服务,TCP是面向连接的,也就是说,利用TCP通信的两台主机首先要经历一个“拨打电话”的过程,等到通信准备结束才开始传输数据,最后结束通话。所以TCP要比UDP可靠的多,UDP是把数据直接发出去,而不管对方是不是在收信,就算是UDP无法送达,也不会产生ICMP差错报文,这一经时重申了很多遍了。把TCP保证可靠性的简单工作原理:应用数据被分割成TCP认为最适合发送的数据块。这和UDP完全不同,应用程序产生的 数据报长度将保持不变。由TCP传递给IP的信息单位称为报文段或段当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能 及时收到一个确认,将重发这个报文段.当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒.TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输 过程中的任何变化。如果收到段的检验和有差错, T P将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)。既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段 的到达也可能会失序。如果必要, TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。TCP还能提供流量控制。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。从这段话中可以看到,TCP中保持可靠性的方式就是超时重发,这是有道理的,虽然TCP也可以用各种各样的ICMP报文来处理这些,但是这也不是可靠的,最可靠的方式就是只要不得到确认,就重新发送数据报,直到得到对方的确认为止。TCP的首部和UDP首部一样,都有发送端口号和接收端口号。但是显然,TCP的首部信息要比UDP的多,可以看到,TCP协议提供了发送和确认所需要的所有必要的信息。可以想象一个TCP数据的发送应该是如下的一个过程。双方建立连接发送方给接受方TCP数据报,然后等待对方的确认TCP数据报,如果没有,就重新发,如果有,就发送下一个数据报。接受方等待发送方的数据报,如果得到数据报并检验无误,就发送ACK(确认)数据报,并等待下一个TCP数据报的到来。直到接收到FIN(发送完成数据报)中止连接可以想见,为了建立一个TCP连接,系统可能会建立一个新的进程(最差也是一个线程),来进行数据的传送--TCP协议TCP是一个面向连接的协议,在发送输送之前 ,双方需要确定连接。而且,发送的数据可以进行TCP层的分片处理。TCP连接的建立过程 ,可以看成是三次握手 。而连接的中断可以看成四次握手 。1.连接的建立在建立连接的时候,客户端首先向服务器申请打开某一个端口(用SYN段等于1的TCP报文),然后服务器端发回一个ACK报文通知客户端请求报文收到,客户端收到确认报文以后再次发出确认报文确认刚才服务器端发出的确认报文(绕口么),至此,连接的建立完成。这就叫做三次握手。如果打算让双方都做好准备的话,一定要发送三次报文,而且只需要三次报文就可以了。可以想见,如果再加上TCP的超时重传机制,那么TCP就完全可以保证一个数据包被送到目的地。2.结束连接TCP有一个特别的概念叫做half-close,这个概念是说,TCP的连接是全双工(可以同时发送和接收)连接,因此在关闭连接的`时候,必须关闭传和送两个方向上的连接。客户机给服务器一个FIN为1的TCP报文,然后服务器返回给客户端一个确认ACK报文,并且发送一个FIN报文,当客户机回复ACK报文后(四次握手),连接就结束了。3.最大报文长度在建立连接的时候,通信的双方要互相确认对方的最大报文长度(MSS),以便通信。一般这个SYN长度是MTU减去固定IP首部和TCP首部长度。对于一个以太网,一般可以达到1460字节。当然如果对于非本地的IP,这个MSS可能就只有536字节,而且,如果中间的传输网络的MSS更加的小的话,这个值还会变得更小。4.客户端应用程序的状态迁移图客户端的状态可以用如下的流程来表示:CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED以上流程是在程序正常的情况下应该有的流程,从书中的图中可以看到,在建立连接时,当客户端收到SYN报文的ACK以后,客户端就打开了数据交互地连接。而结束连接则通常是客户端主动结束的,客户端结束应用程序以后,需要经历FIN_WAIT_1,FIN_WAIT_2等状态,这些状态的迁移就是前面提到的结束连接的四次握手。5.服务器的状态迁移图服务器的状态可以用如下的流程来表示:CLOSED->LISTEN->SYN收到->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED在建立连接的时候,服务器端是在第三次握手之后才进入数据交互状态,而关闭连接则是在关闭连接的第二次握手以后(注意不是第四次)。而关闭以后还要等待客户端给出最后的ACK包才能进入初始的状态。6.TCP服务器设计前面曾经讲述过UDP的服务器设计,可以发现UDP的服务器完全不需要所谓的并发机制,它只要建立一个数据输入队列就可以。但是TCP不同,TCP服务器对于每一个连接都需要建立一个独立的进程(或者是轻量级的,线程),来保证对话的独立性。所以TCP服务器是并发的。而且TCP还需要配备一个呼入连接请求队列(UDP服务器也同样不需要),来为每一个连接请求建立对话进程,这也就是为什么各种TCP服务器都有一个最大连接数的原因。而根据源主机的IP和端口号码,服务器可以很轻松的区别出不同的会话,来进行数据的分发。TCP的交互数据流对于交互性要求比较高的应用,TCP给出两个策略来提高发送效率和减低网络负担:(1)捎带ACK。(2)Nagle算法(一次尽量多的发数据)捎带ACK的发送方式这个策略是说,当主机收到远程主机的TCP数据报之后,通常不马上发送ACK数据报,而是等上一个短暂的时间,如果这段时间里面主机还有发送到远程主机的TCP数据报,那么就把这个ACK数据报“捎带”着发送出去,把本来两个TCP数据报整合成一个发送。一般的,这个时间是200ms。可以明显地看到这个策略可以把TCP数据报的利用率提高很多。Nagle算法上过bbs的人应该都会有感受,就是在网络慢的时候发贴,有时键入一串字符串以后,经过一段时间,客户端“发疯”一样突然回显出很多内容,就好像数据一下子传过来了一样,这就是Nagle算法的作用。Nagle算法是说,当主机A给主机B发送了一个TCP数据报并进入等待主机B的ACK数据报的状态时,TCP的输出缓冲区里面只能有一个TCP数据报,并且,这个数据报不断地收集后来的数据,整合成一个大的数据报,等到B主机的ACK包一到,就把这些数据“一股脑”的发送出去。虽然这样的描述有些不准确,但还算形象和易于理解,我们同样可以体会到这个策略对于低减网络负担的好处。在编写插口程序的时候,可以通过TCP_NODELAY来关闭这个算法。并且,使用这个算法看情况的,比如基于TCP的X窗口协议,如果处理鼠标事件时还是用这个算法,那么“延迟”可就非常大了。 ;
      TCP/IP协议是什么

      简单理解TCP/IP协议

      转自: https://mp.weixin.qq.com/s/sNHPwyyckZZLFMLp-mURWA假如你是一台电脑,你的名字叫 A经过 《如果让你来设计网络,你会把它弄成啥样?》 这篇文章中的一番折腾,只要你知道另一位伙伴 B 的 IP 地址,且你们之间的网络是通的,无论多远,你都可以将一个数据包发送给你的伙伴 B。这就是物理层、数据链路层、网络层这三层所做的事情。站在第四层的你,就可以不要脸地利用下三层所做的铺垫,随心所欲地发送数据,而不必担心找不到对方了。虽然你此时还什么都没干,但你还是给自己这一层起了个响亮的名字,叫做 传输层 。你本以为自己所在的第四层万事大吉,啥事没有,但很快问题就接踵而至。问题来了前三层协议只能把数据包从一个主机搬到另外一台主机,但是,到了目的地以后,数据包具体交给哪个 程序 (进程)呢?所以,你需要把通信的进程区分开来,于是就给每个进程分配一个数字编号,你给它起了一个响亮的名字: 端口号 。然后你在要发送的数据包上,增加了传输层的头部, 源端口号 与 目标端口号 。OK,这样你将原本主机到主机的通信,升级为了 进程和进程之间的通信 。你没有意识到,你不知不觉实现了  UDP 协议 !(当然 UDP 协议中不光有源端口和目标端口,还有数据包长度和校验值,我们暂且略过)就这样,你用 UDP 协议无忧无虑地同 B 进行着通信,一直没发生什么问题。但很快,你发现事情变得非常复杂......丢包问题由于网络的不可靠,数据包可能在半路丢失,而 A 和 B 却无法察觉。对于丢包问题,只要解决两个事就好了。第一个,A 怎么知道包丢了?答案:让 B 告诉 A第二个,丢了的包怎么办?答案:重传于是你设计了如下方案,A 每发一个包,都必须收到来自 B 的 确认 (ACK),再发下一个,否则在一定时间内没有收到确认,就 重传 这个包。你管它叫 停止等待协议 。只要按照这个协议来,虽然 A 无法保证 B 一定能收到包,但 A 能够确认 B 是否收到了包,收不到就重试,尽最大努力让这个通信过程变得可靠,于是你们现在的通信过程又有了一个新的特征, 可靠交付 。停止等待虽然能解决问题,但是效率太低了,A 原本可以在发完第一个数据包之后立刻开始发第二个数据包,但由于停止等待协议,A 必须等数据包到达了 B ,且 B 的 ACK 包又回到了 A,才可以继续发第二个数据包,这效率慢得可不是一点两点。于是你对这个过程进行了改进,采用 流水线 的方式,不再傻傻地等。但是网路是复杂的、不可靠的。有的时候 A 发出去的数据包,分别走了不同的路由到达 B,可能无法保证和发送数据包时一样的顺序。在流水线中有多个数据包和ACK包在 乱序流动 ,他们之间对应关系就乱掉了。难道还回到停止等待协议?A 每收到一个包的确认(ACK)再发下一个包,那就根本不存在顺序问题。应该有更好的办法!A 在发送的数据包中增加一个 序号 (seq),同时 B 要在 ACK 包上增加一个 确认号 (ack),这样不但解决了停止等待协议的效率问题,也通过这样标序号的方式解决了顺序问题。而 B 这个确认号意味深长:比如 B 发了一个确认号为 ack = 3,它不仅仅表示 A 发送的序号为 2 的包收到了,还表示 2 之前的数据包都收到了。这种方式叫 累计确认 或 累计应答 。注意,实际上 ack 的号是收到的最后一个数据包的序号 seq + 1,也就是告诉对方下一个应该发的序号是多少。但图中为了便于理解,ack 就表示收到的那个序号,不必纠结。有的时候,A 发送数据包的速度太快,而 B 的接收能力不够,但 B 却没有告知 A 这个情况。怎么解决呢?很简单,B 告诉 A 自己的接收能力,A 根据 B 的接收能力,相应控制自己的 发送速率 ,就好了。B 怎么告诉 A 呢?B 跟 A 说"我很强"这三个字么?那肯定不行,得有一个严谨的规范。于是 B 决定,每次发送数据包给 A 时,顺带传过来一个值,叫 窗口大小 (win),这个值就表示 B 的 接收能力 。同理,每次 A 给 B 发包时也带上自己的窗口大小,表示 A 的接收能力。B 告诉了 A 自己的窗口大小值,A 怎么利用它去做 A 这边发包的流量控制呢?很简单,假如 B 给 A 传过来的窗口大小 win = 5,那 A 根据这个值,把自己要发送的数据分成这么几类。图片过于清晰,就不再文字解释了。当 A 不断发送数据包时, 已发送的最后一个序号 就往右移动,直到碰到了窗口的上边界,此时 A 就无法继续发包,达到了流量控制。但是当 A 不断发包的同时,A 也会收到来自 B 的确认包,此时 整个窗口 会往右移动,因此上边界也往右移动,A 就能发更多的数据包了。以上都是在窗口大小不变的情况下,而 B 在发给 A 的 ACK 包中,每一个都可以 重新设置 一个新的窗口大小,如果 A 收到了一个新的窗口大小值,A 会随之调整。如果 A 收到了比原窗口值更大的窗口大小,比如 win = 6,则 A 会直接将窗口上边界向右移动 1 个单位。如果 A 收到了比原窗口值小的窗口大小,比如 win = 4,则 A 暂时不会改变窗口大小,更不会将窗口上边界向左移动,而是等着 ACK 的到来,不断将左边界向右移动,直到窗口大小值收缩到新大小为止。OK,终于将流量控制问题解决得差不多了,你看着上面一个个小动图,给这个窗口起了一个更生动的名字, 滑动窗口 。但有的时候,不是 B 的接受能力不够,而是网络不太好,造成了 网络拥塞 。拥塞控制与流量控制有些像,但流量控制是受 B 的接收能力影响,而拥塞控制是受 网络环境 的影响。拥塞控制的解决办法依然是通过设置一定的窗口大小,只不过,流量控制的窗口大小是 B 直接告诉 A 的,而拥塞控制的窗口大小按理说就应该是网络环境主动告诉 A。但网络环境怎么可能主动告诉 A 呢?只能 A 单方面通过 试探 ,不断感知网络环境的好坏,进而确定自己的拥塞窗口的大小。拥塞窗口大小的计算有很多复杂的算法,就不在本文中展开了,假如 拥塞窗口的大小为  cwnd ,上一部分流量控制的 滑动窗口的大小为 rwnd ,那么窗口的右边界受这两个值共同的影响,需要取它俩的最小值。窗口大小 = min(cwnd, rwnd)含义很容易理解,当 B 的接受能力比较差时,即使网络非常通畅,A 也需要根据 B 的接收能力限制自己的发送窗口。当网络环境比较差时,即使 B 有很强的接收能力,A 也要根据网络的拥塞情况来限制自己的发送窗口。正所谓受其 短板 的影响嘛~有的时候,B 主机的相应进程还没有准备好或是挂掉了,A 就开始发送数据包,导致了浪费。这个问题在于,A 在跟 B 通信之前,没有事先确认 B 是否已经准备好,就开始发了一连串的信息。就好比你和另一个人打电话,你还没有"喂"一下确认对方有没有在听,你就巴拉巴拉说了一堆。这个问题该怎么解决呢?地球人都知道, 三次握手 嘛!A:我准备好了(SYN)B:我知道了(ACK),我也准备好了(SYN)A:我知道了(ACK)A 与 B 各自在内存中维护着自己的状态变量,三次握手之后,双方的状态都变成了 连接已建立 (ESTABLISHED)。虽然就只是发了三次数据包,并且在各自的内存中维护了状态变量,但这么说总觉得太 low,你看这个过程相当于双方建立连接的过程,于是你灵机一动,就叫它 面向连接 吧。注意:这个连接是虚拟的,是由 A 和 B 这两个终端共同维护的,在网络中的设备根本就不知道连接这回事儿!但凡事有始就有终,有了建立连接的过程,就要考虑释放连接的过程,又是地球人都知道, 四次挥手 嘛!A:再见,我要关闭了(FIN)B:我知道了(ACK)给 B 一段时间把自己的事情处理完...B:再见,我要关闭了(FIN)A:我知道了(ACK)以上讲述的,就是 TCP 协议的核心思想,上面过程中需要传输的信息,就体现在 TCP 协议的头部,这里放上最常见的 TCP 协议头解读的图。不知道你现在再看下面这句话,是否能理解:TCP 是面向连接的、可靠的、基于字节流的传输层通信协议面向连接、可靠,这两个词通过上面的讲述很容易理解,那什么叫做基于字节流呢?很简单,TCP 在建立连接时,需要告诉对方 MSS(最大报文段大小)。也就是说,如果要发送的数据很大,在 TCP 层是需要按照 MSS 来切割成一个个的  TCP 报文段  的。切割的时候我才不管你原来的数据表示什么意思,需要在哪里断句啥的,我就把它当成一串毫无意义的字节,在我想要切割的地方咔嚓就来一刀,标上序号,只要接收方再根据这个序号拼成最终想要的完整数据就行了。在我 TCP 传输这里,我就把它当做一个个的 字节 ,也就是基于字节流的含义了。一提到 TCP,可能很多人都想起被三次握手和四次挥手所支配的恐惧。但其实你跟着文中的思路你就会发现,三次握手与四次挥手只占 TCP 所解决的核心问题中很小的一部分,只是因为它在面试中很适合作为知识点进行考察,所以在很多人的印象中就好像 TCP 的核心就是握手和挥手似的。 如果你能从问题出发,真正理解 TCP 所想要解决的问题,你会发现很多原理就好像生活常识一样顺其自然,并不复杂,希望你读完本文能有所收获~
      简单理解TCP/IP协议

      TCP和地址解析协议的用途是什么?

      地址解析协议,又称ARP协议,它的主要作用是将网络层的IP地址解析为数据链路层的MAC地址,这样两台需要通信的设备之间才能进行通信!
      TCP和地址解析协议的用途是什么?

      TCP报文结构和功能简析

      TCP:传输、控制、协议。TCP与UDP最大却别就在那个C上面,它充分实现了数据传输时各种控制功能。可以进行丢包重发控制,还可以对次序乱掉的数据包进行顺序控制,还能控制传输流量,这些是UDP中没有的。即T C P 提供一种面向连接的、可靠的字节流服务。TCP是一中面向有链接的协议,只有在确认对端存在的时候,才会发送分数据,从而也可以控制通信流量的浪费。什么是可靠的传输:不丢包、不损坏、不乱序、不重复。TCP通过校验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制来实现可靠传输。接收端查询就收数据TCP首部中的序号和数据长度。将自己下一步应该接受的序列号作为确认应答返送回去。就这样,通过序列号和确认应答,TCP实现可靠传输。一般使用TCP首部用于控制的字段来管理连接。一个连接的建立和断开,正常过程中,至少需要来回共7个包才能完成。TCP首部的数据结构如图所示:TCP包首部为了便于理解,忽略选项部分,固定首部通常为20个字节,将按作用分类分析。前4个字节来标识了发送方的端口号和接收方的端口号,即该数据包由谁发送,由谁接收。前2个字节标识源端口号,紧接着2个字节标识目的端口号。即发送方:(11111111,1111111)2= (65535)10,除去0~1023.即接收方:(11111111,1111111)2= (65535)10,除去0~1023.TCP是面向字节流的。在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置。首部中的序号字段值则是指的是本报文段所发送的数据的第一个字节的序号。长度为4字节,序号是32bit的无符号数,序号到达232- 1后又从0开始。ack:确认序号,即确认字节的序号,更确切地说,是发送确认的一端所期望收到的下一个序号。所谓的发送确认的一端就是将确认信息发出的一端。比如第二次握手的S端就是发送确认的一端。确认序号为上次接收的最后一个字节序号加1.只有确认标志位(ACK)为1的时候,确认序号才有效。也叫首部长度,占4个bit,它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。TCP报文结构由于首部中还有长度不确定的选项字段,因此数据偏移字段是必要的。“首部长度”是4位二进制数,单位是32位字,能表示的最大十进制数字是15。(1111)2=(15)10,即是15个32位,一个32位是4个字节,因此数据偏移的最大值是154=60个字节,这也是TCP首部的最大字节。因为固定首部的存在,数据偏移的值最小为20个字节,因此选项长度不能超过40字节*(减去20个字节的固定首部)。占6位,保留为今后使用,但目前应置为0。当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快发送(相当于高优先级的数据),而不要按原来的排队顺序来传送。例如,已经发送了很长的一个程序要在远地的主机上运行。但后来发现了一些问题,需要取消该程序的运行,因此用户从键盘发出中断命令。如果不使用紧急数据,那么这两个字符将存储在接收TCP的缓存末尾。只有在所有的数据被处理完毕后这两个字符才被交付接收方的应用进程。这样做就浪费了很多时间。当URG置为1时,应用进程就告诉TCP有紧急数据要传送。于是TCP就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍然是普通数据。这时要与首部中紧急指针(Urgent Pointer)字段配合使用。仅当ACK = 1时确认号字段才有效,当ACK = 0时确认号无效。TCP规定,在连接建立后所有的传送的报文段都必须把ACK置为1。当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应。在这种情况下,TCP就可以使用推送(push)操作。发送方TCP把PSH置为1,并立即创建一个报文段发送出去。接收方TCP收到PSH=1的报文段,就尽快地(即“推送”向前)交付接收应用进程。而不用再等到整个缓存都填满了后再向上交付。当RST=1时,表明TCP连接中出现了严重错误(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立传输连接。RST置为1还用来拒绝一个非法的报文段或拒绝打开一个连接。在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使SYN=1和ACK=1。因此SYN=1就表示这是一个连接请求或连接接受报文。用来释放一个连接。当FIN=1时,表明此报文段的发送发的数据已发送完毕,并要求释放运输连接。占2字节。窗口值是(0,216-1)之间的整数。窗口指的是发送本报文段的一方的接受窗口(而不是自己的发送窗口),窗口大小是给对方用的。窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方一次发送的数据量(以字节为单位)。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。总之,窗口值作为接收方让发送方设置其发送窗口的依据。例如,A发送了一个报文段,其确认号是3000,窗口字段是1000.这就是告诉对方B:“从3000算起,A接收缓存空间还可接受1000个字节数据,字节序号是3000-3999”,可以想象到河道的阀门。总之:窗口字段明确指出了现在允许对方发送的数据量。窗口值经常在动态变化。占2字节。检验和字段检验的范围包括首部和数据这两部分。和UDP用户数据报一样,在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。伪首部的格式和UDP用户数据报的伪首部一样。但应把伪首部第4个字段中的17改为6(TCP的协议号是6);把第5字段中的UDP中的长度改为TCP长度。接收方收到此报文段后,仍要加上这个伪首部来计算检验和。若使用TPv6,则相应的伪首部也要改变。占2字节。紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据) 。因此,在紧急指针指出了紧急数据的末尾在报文段中的位置。当所有紧急数据都处理完时,TCP就告诉应用程序恢复到正常操作。值得注意的是,即使窗口为0时也可以发送紧急数据。长度可变,最长可达40个字节。当没有使用“选项”时,TCP的首部长度是20字节。最大报文段长度(MSS:Maximum Segment Size)表示TCP传往另一端的最大块数据的长度。当一个连接建立时,连接的双方都要通告各自的MSS。当建立一个连接时,每一方都有用于通告它期望接收的MSS选项(MSS选项只能出现在SYN报文段中),如果一方不接收来自另一方的MSS值,则MSS就定为默认值536字节(这个默认值允许20字节的IP首部和20字节的TCP首部以适合576字节IP数据报) 。为什么要规定一个最大报文长度MSS呢?这并不是考虑接受方的接收缓存可能存放不下TCP报文段中的数据。实际上,MSS与接收窗口值没有关系。我们知道,TCP报文段的数据部分,至少要加上40字节的首部(TCP首部20字节和IP首部20字节,这里还没有考虑首部中的可选部分)才能组装成一个IP数据报。若选择较小的MSS长度,网络的利用率就降低。设想在极端情况下,当TCP报文段只含有1字节的数据时,在IP层传输的数据报的开销至少有40字节(包括TCP报文段的首部和IP数据报的首部)。这样,对网络的利用率就不会超过1/41。到了数据链路层还要加上一些开销。但反过来,若TCP报文段非常长,那么在IP层传输时就有可能要分解成多个短数据报片。在终点要把收到的各个短数据报片组成成原来的TCP报文段,当传输出错时还要进行重传,这些也都会使开销增大。因此,MSS应尽可能大些,只要在IP层传输时不需要分片就行。由于IP数据报所经历的路径是动态变化的,因此在这条路径上确定的不需要的分片的MSS,如果改走另一条路径就可能需要进行分片。因此最佳的MSS是很难确定的。在连接过程中,双方都把自己能够支持的MSS写入这一字段,以后就按照这个数值传输数据,两个传送方向可以有不同的MSS值。若主机未填写这一项,则MSS的默认值是536字节长。因此,所有在互联网上的主机都应该接受的报文段长度是536+20(固定首部长度)=556字节。后来又增加了几个选项如窗口扩大选项、时间戳选项等。窗口扩大选项是为了扩大窗口。我们知道,TCP首部中窗口字段长度是16位,因此最大的窗口大小为64K字节。虽然这对早期的网络是足够用的,但对于包含卫星信道的网络,传播时延和宽带都很大,要获得高吞吐量需要更大的窗口大小。窗口扩大选项占3字节,其中有一个字节表示移位值S。新的窗口值等于TCP首部中的窗口位数从16增大到(16+S)。移位值允许使用的最大值是14,相当于窗口最大值增大到2(16+14)-1=230-1。窗口扩大选项可以在双方初始建立TCP连接时进行协商。如果连接的某一端实现了窗口扩大,当它不再需要扩大其窗口时,可发送S=0选项,使窗口大小回到16。时间戳选项占10字节,其中最主要的字段是时间戳字段(4字节)和时间戳回送回答字段(4字节)。时间戳选项有以下两个概念:第一、 用来计算往返时间RTT。发送方在发送报文段时把当前时钟的时间值放入时间戳字段,接收方在确认该报文段时把时间戳字段复制到时间戳回送回答字段。因此,发送方在收到确认报文后,可以准确地计算出RTT来。第二、 用于处理TCP序号超过232的情况,这又称为防止序号绕回PAWS。我们知道,TCP报文段的序号只有32位,而每增加232个序号就会重复使用原来用过的序号。当使用高速网络时,在一次TCP连接的数据传送中序号很可能被重复使用。例如,当使用1.5Mbit/s的速度发送报文段时,序号重复要6小时以上。但若用2.5Gbit/s的速率发送报文段,则不到14秒钟序号就会重复。为了使接收方能够把新的报文段和迟到很久的报文段区分开,则可以在报文段中加上这种时间戳。从功能和性能的角度去理解三次握手建立连接第一次:C向S发送一个建立连接的请求。此过程中携带一些报文属性信息,这些信息,存在于报文首部,有初始化用的信息,比如,有用于认证的信息。初始化信息:如报文序列号、SYN:TCP在数据通信之前,通过TCP首部发送的一个SYN标志位,作为建立连接的请求等待接收方确认应答。如果S发来确认应答,则认为可以进行数据通信,否则,就不能进行通信。TCP规定:****SYN=1的报文段不能携带数据,但是要消耗掉一个序号:seq=x。这个时候C进入SYN-SENT(同步已发送)状态。第二次:S收到C请求后,如果同意建立连接,则向C返回确认信息:将SYN、ACK都置1,确认号为ack=seq+1(seq来自客户端),并携带自己的初始化,同时用于认证的信息S。同理:SYN=1的报文段不能携带数据,但是要消耗掉一个序号:seq=y。这个时候S进入SYN-RCVD(同步已接收)状态。C收到S返回的确认信息后,进入ESTABLISHED(已建立连接)的状态,第三次:C收到S返回的确认信息后,向S再一次发送确认报文。ACK置为1,确认号ack=seq+1(seq来自S),自己的seq=x+1。TCP规定:ACK报文可以携带数据。但是,如果不携带数据,则不消耗序号,这时,下一数据报文段的序号仍是seq=x+1。服务器收到客户端返回的确认信息后,也进入ESTABLISHED(已建立连接)的状态,从功能角度去考虑前两次握手,从性能的角度去理解为什么需要第三次握手。有第三次,是考虑到一种错误情况:假设C发了一请求建立连接的报文,长时间未收到S的确认报文,则C会重发,这个时候S与之建立连接、完成数据通信、关闭了连接,这个时候C第一发出的请求建立连接的报文到达了S,S则会等待C发送数据,实际上C已经CLOSED了,S就一直在这等待,浪费资源,确切地说,应该是至少四次数据交互才能实现一个连接的彻底关闭。关闭连接,需要四个报文来指示关闭。TCP是全双工通信的,所以在一端发送数据完毕后,还具有接收另一端的数据的能力,这就所谓的半关闭。四次挥手举个例子:如果C的数据已经发送完毕,C是不能立即关闭的,因为建立连接的通信双方是平等的。C首先告诉S:“数据发送完毕“,这个消息在TCP报文的首部由FIN来标识,让S知道C是准备断开连接了。这是第一次挥手。S收到C发来的FIN标识的报文后,要给C端恢复一个确认FIN的消息,告诉C说,知道你的数据发完了。这是第二次挥手。这个时候,如果S端的数据也发送完毕了,就给C发一个FIN=1报文。这是第三次挥手。C收到S发来的FIN标识的报文后,要给S端恢复一个确认FIN的消息,告诉C说,知道你的数据发完了。这是第四次挥手。然后就彻底断开连接了。TCP的状态变迁图
      TCP报文结构和功能简析

      TCP/IP协议

      TCP/IP协议是一个协议集合,HTTP协议,IP协议,TCP协议,DNS协议等都属于TCP/IP协议。 TCP/IP协议是为了保证全球亿万台计算机能准确、无误的通信。TCP/IP中分层是很重要的概念,每层完成不同的功能。分为应用层,传输层,网络层,数据链路层。分层的目的是为了层级之间的功能相对队里,互不影响。TCP/IP通信数据流HTTP是基于TCP/IP协议的应用层协议,它不涉及数据包的传输,主要规定了客户端和服务器端的通信协议,默认端口是80IP协议的作用是将各种数据包准确无误的传递给对方,其中重要的条件是IP地址和MAC地址。由于IP地址是稀有资源,不可能每个人都有一个IP地址,所以我们通常的IP地址都是路由器给我们生成的IP地址,路由器里面会记录我们的MAC地址,而MAC地址是唯一的。IP实现的两个基本功能:寻址和分段寻址功能就是原地址和目标地址之间建立连接,需要使用ARP协议(Address Resolution Protocol),IP协议就是找到一条连接两台电脑的路径,从而完成数据的交互。地址解析协议,ARP协议,是根据IP地址获取物理地址的一个TCP/IP协议。IP间的通信依赖MAC地址。在进行中转时,会利用下一站中转设备的MAC地址来搜索下一个中转目标,这时就会采用ARP协议,根据通讯放的IP地址就可以反查出对应的MAC地址,从而进行精确的定位,完成寻址的功能。分段功能是为了适应不同网络对包的要求,对数据进行重新组装。TCP协议就是将数据包安全的给对方,IP协议是找到对方的详细地址,分工不同,互不冲突。TCP属于传输层,提供可靠的字节流服务。字节流类似于数据切割,为了方便传输,将大块数据分割成以报文段(segment)为单位的数据包进行管理。可靠的传输服务是指,能够把数据准确可靠的传给对方。TCP协议为了更容易的传输大数据才将数据进行分割,而且TCP协议能够确认数据最终是否送达对方。为了确保信息准确无误的送达,TCP采用了三次握手策略(three-way-handshaking)。TCP建立连接时需要三次握手,在关闭连接时还需要四次握手。 这部分占用了http请求过程的中大量时间,在高并发时,可以考虑优化这部分。和HTTP协议一样是处于应用层的服务,提供域名到IP地址之间的解析服务。1、可缓存:get请求能缓存,post请求不能;响应报文的状态码是可缓存的,包括:200, 203, 204, 206, 300, 301, 404, 405, 410, 414, and 501。2、get是获取资源,post用于传输实体主体。3、参数:get请求的参数在url里面,会被浏览器保存历史记录,post的请求数据在数据包里面,同时因为url只支持ASCII码,因此get的参数如果存在汉字就要先进性编码,post请求支持更多的编码类型且不对数据类型限制;post传输的数据比get的多;url的长度有限制,会影响get请求;4、安全的HTTP方法不会改变服务器状态,也就说是只读的。所以get是安全的,post不是安全的。5、幂等性:get是幂等的,post不是幂等的。6、XMLHttpRequest: 在使用XMLHttpRequest时,post请求发送时,浏览器会先发送header再发送Data;get请求header和data一起发送。XMLHttpRequest 是一个 API,它为客户端提供了在客户端和服务器之间传输数据的功能。它提供了一个通过 URL 来获取数据的简单方式,并且不会使整个页面刷新。这使得网页只更新一部分页面而不会打扰到用户。XMLHttpRequest 在 AJAX 中被大量使用。200 OK,表示从客户端发来的请求在服务器端被正确处理。204 No content,表示请求成功,但是想要报文不包含实体的主体部分。206 Partial Content ,进行范围请求。301 moved permanently 永久性重定向,表示自愿一杯分配了新的URL。302 found 临时性重定向,表示自愿临时被分配了新的URL。303 see other 表示资源存在着另一个URL,应使用GET方法获取资源。和 302 有着相同的功能,但是 303 明确要求客户端应该采用 GET 方法获取资源。注:虽然 HTTP 协议规定 301、302 状态下重定向时不允许把 POST 方法改成 GET 方法,但是大多数浏览器都会在 301、302 和 303 状态下的重定向把 POST 方法改成 GET 方法。304 not modified 表示服务器允许访问资源,但因发生请求未满足条件的情况。307 temporary redirect,临时重定向,和302含义相同。但是 307 要求浏览器不会把重定向请求的 POST 方法改成 GET 方法。400 bad request 请求报文存在语法错误401 unauthorized 表示没有权限403 forbidden 表示对请求资源的访问被服务器拒绝404 not found 表示在服务器上没有找到请求的资源500 internal sever error 表示服务器端在执行请求时错误503 service unavailable 表明服务器暂时处于超负载或正在停机维护,无法处理请求HTTPS是HTTP建立在SSL/TLS安全协议上的。在IOS中,客户端本地会存有CA证书,在HTTPS请求时,会首先向服务器获取公钥,获得公钥后会使用本地的CA证书验证公钥的正确性,然后通过正确的公钥加密信息发送给服务器,服务器会使用私钥解密信息。SSL/TSL握手阶段分为五步:HTTP和HTTPS的对比:HTTP:无状态,协议对客户端没有状态存储;无连接,每次请求都会和服务器重新建立连接;基于请求和响应,由客户端发起,服务端响应;简单快速,灵活;使用明文,请求和响应不会对通信方进行确认,无法保证数据的完整性。 HTTPS:内容加密,采用混合加密技术,中间者无法直接查看明文内容;验证身份,通过证书认真客户端访问的是自己的服务器;保护数据完整性,放置传输的内容被中间人冒充或篡改。
      TCP/IP协议

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/42618.html

          热门文章

          文章分类