传输层协议-TCP

大学学习的TCP,发现还挺重要的,今天抽空复习一下。

传输层协议
  1. 传输层的功能:传输层位于网络层之上,网络层提供了主机与主机之间的逻辑通信,而传输层则提供了不同主机上进程间的逻辑通信(简称端对端的通信)。
  2. 传输层的复用和分用:复用是指发送方不同的应用进程都可以使用一个传输层协议传送数据;分用是指接收方的传输层在剥去报文的首部后能够把数据正确交付到目的应用进程。

网络层的复用是指发送方不同协议打的数据都可以包装成IP数据报发送出去,分用是指接收方的网络层在剥去首部后把数据交付给相应的协议。

  1. 传输层还要对收到打的报文进行差错检测(首部+数据部分)。而网络层只会检查IP数据报的首部,不校验数据部分是否出错。
  2. 提供两种种不同的传输协议,面线链接TCP和无连接UDP,而网络层无法同时实现两种协议(即在网络层要么提供面向链接的服务,如虚电路,要么提供无连接服务,数据报)
传输层的寻址与端口

传输层协议通过 IP : PORT(套接字,SOCKET),来将数据交付给相关应用进程。提供了一条端但端的逻辑通信信道。这条逻辑通信信道是一条全双工的可靠信道(针对TCP来说,UDP则是不可靠的)。端口是为了标志本计算机应用中的各进程的,是传输层的服务访问点(简称SAP)。

单工数据传输:只支持数据在一个方向上传输;如电视,广播

半双工数据传输:允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;

全双工数据传输:允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力;

数据链路层的SAP是MAC地址,网络层的SAP是IP地址。

端口号长度为16bit,能够表示表示65536(2^16)个不同的端口号。
一般来说分为,服务端使用的端口号和客户端使用的端口号。服务端端口号0~1023称为熟知端口号,IANA(互联网地址指派机构)把这些端口号指派给了TCP/IP最重要的一些应用。另一类叫做登记端口号,数值为1024~49151,使用这类端口号必须在IANA登记,以防止重复。49152~65535这类端口号仅在客户进程运行时才动态选择,因此又叫短暂端口号(临时端口号),通信结束后,刚才使用过的客户端口号就不复存在了。

无连接服务与面向个连接服务

TCP提供面向连接的服务,在传输数据时需要建立连接,传输完毕后,释放连接。TCP不提供广播或组播服务,由于TCP是面向连接的可靠传输服务,因此不可避免增加了许多开销,如确认,流量控制,计时器以及连接管理等。主要应用于可靠性更重要的场合,如FTP(文件传输协议),HTTP(超文本传输协议),TELNE(远程登陆)等。

UDP是一个无连接非可靠的传输层协议,它在IP之上仅提供了两种附加服务,多路复用和数据的错误检查。主要应用于TFTP(小文件传输协议),DNS,SNMP和RTP(实时协议)

TCP协议

TCP是在不可靠的IP层之上实现了可靠的数据传输协议,它主要解决了传输的可靠、有序、无丢失和不重复的问题。

  1. 源端口和目的端口各占2个字节
  2. 序号占4字节,TCP是面向字节流的,传送的数据流每一个字节都会编上一个序号。例如,一个报文的序号为301,并且携带100个字节的数据,那么下一个序号就是401。第一个序号随机产生,并且溢出后,从0接着开始。
  3. 确认号占4的字节,TCP是有序可靠的,所以如果确认号=N,则表明到序号N-1为止的所有数据都正确收到。
  4. 数据偏移,(即首部长度)占4个位。数据偏移的单位是32位(4字节位为计算单位)。所有当此字段长度为15时,达到TCP首部的最大长度60字节。
  5. 保留字段,保留给今后使用,目前为0。
  6. 紧急位URG,当URG=1时,表明紧急指针字段有效,它告诉系统此报文段中有紧急舒缓句,应尽快传送。但是URG需要和紧急指针配套使用,也就是说数据从第一个字节到紧急指针所指向的字节都是紧急数据。
  7. 确认位ACK,只有当ACK=1时,确认号字段才有效。ACK=0时,确认号无效。TCP规定,在建立连接后,所有传送的报文段必须把ACK置为1
  8. 推送为PSH(PUSH),接受TCP收到PSH=1的报文段,就尽快地交付接受应用进程,而不在等整个缓存都填满了后再向上交付。
  9. 复位位RST(Reset),当RST=1时,表明TCP连接中出现了严重差错,必须释放连接,然后重新建立连接。
  10. 同步位为SYN,SYN=1表示这是一个连接请求或连接接受报文。
    SYN=1 ACK=0 表示连接请求报文
    SYN=1 ACK=1 表示连接接受报文
  11. 终止位FIN(Finish)用来释放一个连接,FIN=1表示此报文段的发送方的数据已经发送完毕,并要求释放传输连接。
  12. 窗口字段占2字节,它指出了现在允许对方发送的数据量,接收方的数据缓存空间是有限的。故用窗口值作为接受方让发送方设置发送窗口的依据。单位为字节。
  13. 校验和占2字节,校验和字段检验的范围包括首部和数据两个部分。在计算校验和时,要在TCP报文段前面加上12字节的伪首部。

校验和计算:首先将伪首部(32位源地址+32位目标地址+8位协议+16位报文长度)增加到TCP报文上,将校验和字段设置为0,将所有位划分为16位的字,将这些字进行累加,溢出部转移到最低位上,将最终结果取反。

校验和的验证:计算一样,将所有位(此时校验和字段不是0),以16位为一个字进行分割,累加之后,算1的补码和,之后取反得到0。

  1. 紧急指针字段占16位,指出在本报文段中紧急数据共有多少字节。
  2. 选项字段长度可变,TCP最初只规定了一种选项,即最大报文段长度(Maximum Segment Size ,MSS),MSS是TCP报文段中的数据字段的最大长度。
  3. 填充字段这是为了使整个首部长度是4字节的整数倍。
TCP连接建立-三次握手

TCP连接建立采用了客户端服务器方式,主动发起连接建立的应用程序叫做客户机(Client),而被动等待连接建立的应用进程叫做服务器(Server)。

三次握手主要解决了三个问题:

  1. 通信双发知道彼此的存在
  2. 双方能够协商一些参数(如最大窗口值,是否使用窗口扩大选项,时间戳选项以及服务质量等)
  3. 能够对运输实体资源(如缓存大小、连接表中的项目等)进行分配。

三次握手:

  1. 由客户机TCP首次向服务器TCP(处于LISTEN状态)发送一个连接请求报文,这个报文不包含任何数据,SYN=1 seq=x 客户端随机选择一个起始序号(虽然不携带任何数据但是消耗一个序号)。客户端处于SYN-SEND状态。
  2. 服务端TCP收到连接请求报文,如果同意连接,则向客户机发回确认,并为TCP连接分配TCP缓存和变量,返回报文段 SYN=1 ACK=1,确认号字段值为x+1,并且服务器随机产生起始序号seq=y。响应客户端,服务端处于SYN-RCVD状态。
  3. 当客户端收到确认报文后,还要向服务端,给出确认。并且也要给连接分配缓存和变量。这个报文端 ACK=1 seq=x+1 ack=y+1 。客户端处于ESTAB-LISIED状态,服务端接受到后处于ESTAB=LISITED状态。

为什么是三次握手而不是两次握手?两次握手会出现什么问题?
两次握手的话,第一次客户端A向服务端B发送请求,服务端B接收到请求后,但是客户端A并不知道是否发送成功,于是服务端B就向A发送确认。没有第三次握手的话,第二次握手服务端B就默认自己发送是没有问题的建立起了链接,但是如果B实际是没有发送能力的,或者A没有接受能力。那么只会建立一个无效的链接,白白浪费服务端B的资源(有一种网络攻击手段就是发送,SYN给服务,但客户端并不存在,就会让服务其处于半连接得状态浪费资源)。
为什么不是四次握手呐?
这个仔细分析,三次握手可以保证客户端A和服务端B感知彼此存在,相互发送数据,增加一次通信反而浪费了资源。

TCP连接释放-四次挥手
  1. 客户端发送一个连接释放保温 FIN=1,seq=u(等于前面已传输字节序号+1),发送FIN报文时,发送FIN端就不能再发送数据了,但对方还可以发送数据。客户端处于FIN-WAIT-1状态。
  2. 服务端接受到连接释放报文立即发送确认,ACK=1 ack=u+1 seq=v(前面已传输字节+1)。此时服务端处于CLOSE-WAIT状态。服务端接受后处于FIN-WAIT-2状态。TCP连接处于半关闭状态即客户端到服务端的连接被释放,但服务端发送数据客户端还可以受到。
  3. 若服务端已经没有向客户端发送的数据,就通知TCP释放连接。此时发出FIN=1 ACK=1 seq=w ack=u+1连接释放报文。此时服务端处于LAST-ACK状态。
  4. 客户端发送ACK=1 seq=u+1 ack=w+1,处于TIME-WAIT阶段,服务端收到后转换成CLOSED状态,客户端等待2MSL后,转换成CLOSED状态。
TCP可靠传输的实现

TCP的主要任务就是在不可靠的IP层,尽力的为服务建立一种可靠数据传输服务。可靠数据传输服务就是保证接收方进程从缓存区读出的字节流与发送方发出的字节流是完全一样的。

  1. 序号:TCP将数据看作一个无结构但是有序的字节流,在传输中为每个字节都编上一个需要。例如一个TCP数据包,发送了2字节,需要从零开始这个包的序号就为0,第二个TCP数据包的序号就为3.
  2. 确认:TCP的确认号就是期望收到对方的下一个报文段的第一个字节序号。发送方缓存区会继续存储那些已经发送但未收到确认的报文端,以便在需要的时候重传。TCP默认使用累计确认,即TCP只会确认数据流第一个字节丢失为止的字节。
  3. 重传:两种情况会导致TCP发送方,重传报文端。


超时:TCP每发送一个报文段,就对这个报文端设置一个计时器,只要到期没有收到确认就会重传这个报文段。

为了计算超时计时器的重传时间,TCP采用了一种自适应算法,它记录了一个报文发出的时间,以及收到相应确认的时间,这两个时间之差叫做报文的往返时间(Round-Trip Time RTT),TCP保留了RTT的一个加权平均往返时间RTTs。
新的RTTs=(1-a)×(旧的RTTs)+a×(新的RTT样本)

其中,0<=a<1。[RFC 2998]推荐的a的值为0.125

(Retransmission Time-Out,RTO)应该略大于上面的RTTs计算方式,RTO=RTTs+4×RTTd

RTTd是RTT的偏差的加权平均值

新的RTTd=(1-B)×(旧的RTTd)+B×|RTTs-新的RTT样本|


冗余ACK:超时重传的问题是周期比较长,TCP规定每当比期望号大的失序报文段到达时,发送一个冗余ACK,指明洗一个期望的字节序号,TCP还规定,当发送方,收到对同一个报文段的3个冗余ACK时,就可以认为确认报文端之后的报文端已经丢失。就会对它进行补发。这种技术通常也被称为快速重传。

流量控制

流量控制是一个速度匹配服务,匹配发送方的发送速率与接收方的读取速率。TCP提供了一种基于滑动窗口协议的流量控制。接收方根据自己接受缓存的大小,动态的调整发送方的发送窗口,这就是接受窗口rwnd。发送方根据,其对当前网络拥塞程序的估计确定的窗口值成为拥塞窗口(cwnd,其大小与网络的带宽和时延密切相关)。接收方在发送确认报文时,通过报文首部的窗口字段将rwnd通知给发送方。发送方实际的发送窗口取rwnd和cwnd的最小值

TCP拥塞控制
  1. 慢开始算法
    TCP刚刚连接好,发送TCP报文时,首先令cwnd=1,即一个最大报文段长度MSS。每收到一个对新的报文段确认后,将cwnd加1.即增加一个MSS。使用慢开始算法后,每经过一个传输轮次(RTT),拥塞窗口cwnd就会加倍。直到增大到一个规定的慢开始门限ssthresh(阈值),然后改用拥塞避免算法。
  2. 拥塞避免算法,发送端的拥塞窗口cwnd每经过一个RTT,就增加一个MSS而不是加倍,拥塞避免算法使cwnd按照线性规律缓慢增长(加法增大)。
  3. 网络拥塞处理
    当发送方检测到超时事件发生,就会把满开始门限ssthresh设置为出现拥塞时发送方cwnd值得一半(但不能小与2)。然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。这样做的目的是迅速减少主机发送到网络中得分组数,使得发生拥塞得路由器有足够时间把队列中积压得分组处理完毕。
  • 综上所述
    当cwnd < ssthresh ,使用慢开始算法,指数增大。
    当cwnd >= ssthresh ,停止使用满开始算法改为拥塞避免算法,加法增大。
    当出现网络时延时,则使用乘法减小,重新设置ssthresh

拥塞控制与流量控制的区别:拥塞控制根据当前网络环境,控制发送方的发送数据窗口。防止在网络中注入太多数据。流量控制则是发送发根据接收方的缓存区大小调整自身的发送数据量,防止发送太多数据,但接收方实际是无法缓存下来的。

快重传和快恢复
  1. 快重传并不是取消重传计时器,而是当接收方收到一个不是期望的数据包时,就会重新发送确认ACK,当发送方接受到三个重复的ACK报文时,直接重传对
    方期望的报文,不必等待重计时器。

  2. 当发送端收到连续三个冗余ACK,就执行“乘法减小”算法,把cwnd的值设置为慢开始门限ssthresh改变后的数值,然后执行拥塞避免算法(加法增大)(这里跟上面的慢开始不一样哦)。使拥塞窗口缓慢的线性增大。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352