【网络协议笔记】第四层:传输层(Transport)TCP协议简介(1)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【网络协议笔记】第四层:传输层(Transport)TCP协议简介(1)相关的知识,希望对你有一定的参考价值。
参考技术ATCP有以下几个知识点。
图片备用地址
图片备用地址
TCP的几个要点:可靠传输、流量控制、拥塞控制、连接管理(建立和释放连接)。
也正因为这几点使得首部变得很复杂。
占4位,取值范围是0x0101 ~ 0x1111。
乘以4就是首部长度(Header Length)。所以取值范围是5 ~ 60字节,由于首部固定部分占用20字节,所以可选部分至多占用40字节(和网络层首部一样)。
为什么叫数据偏移?因为相对TCP报文向右偏移首部长度后就是数据部分。
UDP的首部中有个16位的字段记录了整个UDP报文段的长度(首部 + 数据)。
但是,TCP的首部中仅仅有个4位的字段记录了TCP报文段的首部长度,并没有字段记录TCP报文段的数据长度。
分析:UDP首部中占16位的长度字段是冗余的,纯粹是为了保证首部是32bit对齐。
TCP/UDP的数据长度,完全可以由IP数据包的首部推测出来,传输层的数据长度 = 网络层的总长度 - 网络层的首部长度 - 传输层的首部长度。
占6位,目前全为0。
与UDP一样,TCP检验和的计算内容:伪首部 + 首部 + 数据。伪首部占用12字节,仅在计算检验和时起作用,并不会传递给网络层。
图片备用地址
一共占6位或9位。
有些资料中,TCP首部的保留(Reserved)字段占3位,标志(Flags)字段占9位。Wireshark中也是如此。是因为标志位中的前3位是无用的,所以两种说法都不能说是错的。
图片备用地址
图片备用地址
意思:紧急。当URG=1时,紧急指针字段才有效。表明当前报文段中有紧急数据,应优先尽快传送。
紧急指针存放的是长度值,表示TCP的前多少字节是需要紧急优先处理的。
意思:确认。当ACK=1时,确认号字段才有效。
意思:推。一般用在交互式网络中。PUSH标志位所表达的是发送方通知接收方传输层应该尽快的将这个报文段交给应用层。
意思:重置。当RST=1时,表明连接中出现严重差错,必须释放连接,然后再重新建立连接。
意思:同步。当SYN=1 & ACK=0时,表明这是一个建立连接的请求。若对方同意建立连接,则回复SYN=1 & ACK=1。
请求方再发送SYN=0 & ACK=1时表明开始传输数据。这也是三次握手的流程。
意思:完成。表明数据已经发送完毕,要求释放连接。
占4字节。首先,传输的每一个字节都会有一个编号(连续的字节编号也是连续的)。
在建立连接后,序号代表这一次传给对方的TCP数据部分的第一个字节的编号。
占4字节。在建立连接后,确认号代表期望对方下一次传过来的TCP数据部分的第一个字节的编号。
占2字节。这个字段有流量控制功能,用以告知对方下一次允许发送的数据大小(字节为单位)。
ARQ(Automatic Repeat-reQuest), 自动重传请求。
图片备用地址
无差错情况
A发送数据M1到B,B收到数据M1后向A发送确认信号M1;
A收到确认信号M1后,继续向B发送数据M2,B接收后向A发送确认信号M2。
超时重传
A发送数据M1到B,A在发送数据途中丢包或B发现数据M1有错误直接丢掉,导致B无法向A发送确认信号M1;
A在一定时间间隔后发现没有收到B发送的确认信号M1,A会继续向B发送数据M1;
B收到数据M1后向A发送确认信号M1,A收到确认信号M1后,继续向B发送M2数据。
通过确认与超时重传机制实现可靠传输,在发送完一个分组后,必须暂时保留已发送的分组的副本。
分组和确认分组都必须进行编号。超时计时器的重传时间应当比数据在分组传输的平均往返时间更长一些。
图片备用地址
确认丢失
A发送数据M1到B,B接收到数据M1后,向A发送确认信号M1;
B在向A发送确认信号M1中途丢包,此时A在一定时间间隔后发现没有收到B发送的确认信号M1,A会继续向B发送数据M1;
B收到数据M1后会丢弃重复的数据M1(之前已经收到数据M1,只是A不知道),继续向A发送确认信号M1;
A收到确认信号M1后,继续开始发送M2数据。
确认迟到
A发送数据M1到B,B接收到数据M1后,向A发送确认信号M1;
B在向A发送确认信号M1时,由于网络延迟等原因导致A在一定时间段内未收到确认信号;
A会继续向B发送数据M1,B收到数据M1后丢弃重复的数据M1,并向A发送确认信号M1;
A收到确认信号M1后,继续开始发送M2数据,M2数据刚发送出去,此时A刚好接收到B在第一次发送的确认信号M1,
但由于之前已经成功接收并处理了第二次的确认信号M1,所以A在收到确认信号后什么也不做。
出现差错或丢失的时候,发送方会将自己备份的副本再重传一次,直到收到接收的确认信息。
当接收方收到重复的数据时,会直接丢弃,但是会给发送方请确认自己已经收到了。
上面的停止等待协议每发送一组数据就必须等到接收方回复确认后,再发起第二组数据,如果出现超时重传的话,效率更低。
因此为了提高传输的效率,改进了等待传输协议。
连续ARQ协议和滑动窗口协议的机制是以接收方回复确认为单位,每次连续发送一个滑动窗口指定的数据组。
图片备用地址
A发送数据给B时,一次性发送M1~M4(A和B建立连接时,B告诉A自己的缓存池可以容纳多少字节数据,
A根据这个缓存池的大小构建一个同大小的发送窗口–也可以理解为发送缓存池),此时A开始等待确认,B收到全部数据后会向A发送确认信号M4(以最后一个编号为准);
A收到确认信号后,继续向B发送M5 M8(A把之前构建的窗口滑动并锁定到对应大小的数据段上,即M5 M8),以此往复直到数据传输完毕。
如果接收窗口最多能接收4个包(窗口大小),但发送方只发了2个包,接收方如何确定后面还有没有2个包?
答案:接收方会在等待一定时间后发现没有第3个包,就会返回收到2个包的确认信号给发送方。
滑动窗口是由发送方维护的类似指针的变量,在每收到一个接收方的确认消息后,
该指针向前移动并发送数据,到窗口指定大小的数据组时停下,等待接收方的确认。
图片备用地址
累积确认机制: 发送方不对收到的分组逐个发送确认,而是对按序到达的最后一个分组发送确认,
这样就表示:到这个分组为止的所有分组都已正确收到了。
优点:容易实现,即使确认丢失也不必重传。
缺点:不能向发送方反映出接收方已经正确收到的所有分组的信息。
Go-back-N(回退 N): 为了解决上述同一窗口中数据组不能完整确认的问题,连续ARQ协议采用了回退机制。
比如说:发送方发送了前5个分组,而中间的第3个分组丢失了。这时接收方只能对前两个分组发出确认。
发送方无法知道后面三个分组的下落,而只好把后面的三个分组都再重传一次。这就叫做 Go-back-N(回退 N),表示需要再退回来重传已发送过的N个分组。
结论:当通信线路质量不好时,连续ARQ协议会带来负面的影响。可能还不如传统的停止等待协议。
TCP连接的每一端都必须设有两个窗口——一个发送窗口和一个接收窗口。
TCP的可靠传输机制用字节的序号进行控制。TCP所有的确认都是基于序号而不是基于报文段。
TCP两端的四个窗口经常处于动态变化之中。
TCP连接的往返时间RTT也不是固定不变的。需要使用特定的算法估算较为合理的重传时间。
滑动窗口是面向字节流的,为了方便记住每个分组的序号,
现在假设有一个1200字节的数据,分12组,每一组数据是100个字节,代表一个数据段的数据(每一个数据都有自己的TCP首部),每一组给一个编号(1~12)。
图片备用地址
图片备用地址
TCP通信时,如果发送序列中间某个数据包丢失,TCP会通过重传最后确认的分组后续的分组,这样原先已经正确传输的分组也可能重复发送,降低了TCP性能。
SACK(Selective Acknowledgment,选择确认)技术 ,使TCP只重新发送丢失的包,不用发送后续所有的分组,
而且提供相应机制使接收方能告诉发送方哪些数据丢失,哪些数据已经提前收到等。
在建立TCP连接时,就要在TCP首部的选项中加上“允许SACK”的选项,而双方必须都事先商定好。
原来首部中的“确认号字段”的用法仍然不变。只是以后在TCP报文段的首部中都增加了SACK选项,以便报告收到的不连续的字节块的边界。
图片备用地址
Kind:占1个字节,值为5代表这是SACK选项。
Length:占1个字节,表明SACK选项一共占用多少字节。
Left Edge:占4个字节,左边界。
Right Edge:占4个字节,右边界。
图片备用地址
上图的着色模块代表已接收数据,空白代表未接收数据。左右边界意思是会把未接收完毕的TCP数据包的已接收数据进行左右标记。
由于TCP的选项不能超过40个字节,去除Kind和Length占用的2个字节,还剩下38个字节给左右边界使用。
一组边界占用8个字节(左右边界各占4个字节),所以边界不能超过4组。也能够因此推断出SACK选项的最大占用字节数是4 * 8 + 2 = 34。
思考:超过选项边界的数据怎么办?
超过边界的数据需要重新传输,但这已经很大程度提高了传输效率。
重传机制是TCP中最重要和最复杂的问题之一。TCP每发送一个报文段,就对这个报文段设置一次计时器。
只要计时器设置的重传时间到但还没有收到确认,就要重传这一报文段。那么这个重传时间到底应该设置多少呢?建议跳过,有兴趣的可以去查阅相关资料。
图片备用地址
为什么选择在传输层就将数据分割成多个段,而不是等到网络层再分片传递给数据链路层?
-->网络层没有可靠传输协议,丢包无法只发送一个报文段,所以需要分割成多个段。
如果在传输层不分段,一旦出现数据丢失,整个传输层的数据都得重传
如果在传输层分段了,一旦出现数据丢失,只需要重传丢失的那些段即可
欢迎大家的意见和交流
email: li_mingxie@163.com
TCP 传输控制协议(转)
开头先说几个协议:
IP:网际协议
TCP:传输控制协议
Http:超文本传输协议
AMQP:高级消息队列协议
一:TCP是什么?
TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
首先来看看OSI的七层模型:
我们需要知道TCP工作在网络OSI的七层模型中的第四层——Transport层,IP在第三层——Network层,ARP在第二层——Data Link层;
在第二层上的数据,我们把它叫Frame,在第三层上的数据叫Packet,第四层的数据叫Segment。
同时,我们需要简单的知道,数据从应用层发下来,会在每一层都会加上头部信息,进行封装,然后再发送到数据接收端。这个基本的流程你需要知道,就是每个数据都会经过数据的封装和解封装的过程。
在OSI七层模型中,每一层的作用和对应的协议如下:
详细协议:
OSI: 物理层:EIA/TIA-232, EIA/TIA-499, V.35, V.24, RJ45, Ethernet, 802.3, 802.5, FDDI, NRZI, NRZ, B8ZS 数据链路层:Frame Relay, HDLC, PPP, IEEE 802.3/802.2, FDDI, ATM, IEEE 802.5/802.2, 【ARP,RARP】,VLAN、MAC 网络层:IP,IPX,AppleTalk DDP,OSPF、RIP、IGRP、ICMP、ARP、RARP 传输层:TCP,UDP,SPX 会话层:RPC,SQL,NFS,NetBIOS,names,AppleTalk,ASP,DECnet,SCP 表示层:TIFF,GIF,JPEG,PICT,ASCII,EBCDIC,encryption,MPEG,MIDI,HTML 应用层:HTTP,FTP,WWW,Telnet,NFS,SMTP,Gateway,SNMP
在Wireshark中对应查看:
二:查看TCP头部:
头部的详细说明:
Source Port和Destination Port:分别占用16位,表示源端口号和目的端口号;用于区别主机中的不同进程,而IP地址是用来区分不同的主机的,源端口号和目的端口号配合上IP首部中的源IP地址和目的IP地址就能唯一的确定一个TCP连接; Sequence Number:用来标识从TCP发端向TCP收端发送的数据字节流,它表示在这个报文段中的的第一个数据字节在数据流中的序号;主要用来解决网络报乱序的问题; Acknowledgment Number:32位确认序列号包含发送确认的一端所期望收到的下一个序号,因此,确认序号应当是上次已成功收到数据字节序号加1。不过,只有当标志位中的ACK标志(下面介绍)为1时该确认序列号的字段才有效。主要用来解决不丢包的问题; Offset:给出首部中32 bit字的数目,需要这个值是因为任选字段的长度是可变的。这个字段占4bit(最多能表示15个32bit的的字,即4*15=60个字节的首部长度),因此TCP最多有60字节的首部。然而,没有任选字段,正常的长度是20字节; TCP Flags:TCP首部中有6个标志比特,它们中的多个可同时被设置为1,主要是用于操控TCP的状态机的,依次为URG,ACK,PSH,RST,SYN,FIN。每个标志位的意思如下: URG:此标志表示TCP包的紧急指针域(后面马上就要说到)有效,用来保证TCP连接不被中断,并且督促中间层设备要尽快处理这些数据; ACK:此标志表示应答域有效,就是说前面所说的TCP应答号将会包含在TCP数据包中;有两个取值:0和1,为1的时候表示应答域有效,反之为0; PSH:这个标志位表示Push操作。所谓Push操作就是指在数据包到达接收端以后,立即传送给应用程序,而不是在缓冲区中排队; RST:这个标志表示连接复位请求。用来复位那些产生错误的连接,也被用来拒绝错误和非法的数据包; SYN:表示同步序号,用来建立连接。SYN标志位和ACK标志位搭配使用,
当连接请求的时候,SYN=1,ACK=0;连接被响应的时候,SYN=1,ACK=1;这个标志的数据包经常被用来进行端口扫描。扫描者发送一个只有SYN的数据包,如果对方主机响应了一个数据包回来 ,就表明这台主机存在这个端口;
但是由于这种扫描方式只是进行TCP三次握手的第一次握手,因此这种扫描的成功表示被扫描的机器不很安全,一台安全的主机将会强制要求一个连接严格的进行TCP的三次握手; FIN: 表示发送端已经达到数据末尾,也就是说双方的数据传送完成,没有数据可以传送了,发送FIN标志位的TCP数据包后,连接将被断开。这个标志的数据包也经常被用于进行端口扫描。
三:TCP的连接
TCP的传输主要分为连接,传输数据,断开连接
三次握手连接:主要根据TCP头部中的Seq,Ack来进行判断
查看WireShark抓包记录:
查看网络说明:
第一次握手:建立连接。客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认; 第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);
同时,自己自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。 完成了三次握手,客户端和服务器端就可以开始传送数据。以上就是TCP三次握手的总体介绍。
为什么要三次握手?
为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
具体例子:“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。
本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。
假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。
这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。”
完整流程图片:
数据传输完毕,断开TCP连接,即四次挥手
第一次挥手:主机1(可以是客户端,也可以是服务器端),设置Sequence Number和Acknowledgment Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了; 第二次挥手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我“同意”你的关闭请求; 第三次挥手:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态; 第四次挥手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。
为什么要四次分手?
TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。 TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了; 但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的; 当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。
查看最后四条tcp记录:
再看一张完整流程的图:
TCP流量控制:
如果发送方把数据发送得过快,接收方可能会来不及接收,这就会造成数据的丢失。所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。
利用滑动窗口机制可以很方便地在TCP连接上实现对发送方的流量控制。
设A向B发送数据。在连接建立时,B告诉了A:“我的接收窗口是 rwnd = 400 ”(这里的 rwnd 表示 receiver window) 。因此,发送方的发送窗口不能超过接收方给出的接收窗口的数值。
请注意,TCP的窗口单位是字节,不是报文段。假设每一个报文段为100字节长,而数据报文段序号的初始值设为1。大写ACK表示首部中的确认位ACK,小写ack表示确认字段的值ack。
从图中可以看出,B进行了三次流量控制。第一次把窗口减少到 rwnd = 300 ,第二次又减到了 rwnd = 100 ,最后减到 rwnd = 0 ,即不允许发送方再发送数据了。
这种使发送方暂停发送的状态将持续到主机B重新发出一个新的窗口值为止。B向A发送的三个报文段都设置了 ACK = 1 ,只有在ACK=1时确认号字段才有意义。
TCP为每一个连接设有一个持续计时器(persistence timer)。只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器。若持续计时器设置的时间到期,就发送一个零窗口控测报文段(携1字节的数据),那么收到这个报文段的一方就重新设置持续计时器。
https://github.com/jawil/blog/issues/14
http://www.cnblogs.com/TankXiao/archive/2012/10/10/2711777.html
https://hit-alibaba.github.io/interview/basic/network/TCP.html
以上是关于【网络协议笔记】第四层:传输层(Transport)TCP协议简介(1)的主要内容,如果未能解决你的问题,请参考以下文章