TCP/IP协议簇之传输层

TCP/IP协议簇系列目录

OSI七层模型及各层功能概述

TCP/IP协议簇概述

TCP/IP协议簇之物理层

TCP/IP协议簇之数据链路层

TCP/IP协议簇之网络层

TCP/IP协议簇之传输层

TCP/IP协议簇之应用层

TCP/IP协议簇之HTTP协议

---------------------------------------------------------------------------------------------------------------------------

一、传输层概述

       传输层是整个网络体系结构中的关键层次之一,主要负责向两个主机中进程之间的通信提供服务。传输层在终端用户之间提供透明的数据传输,向上层提供可靠的数据传输服务。传输层提供逻辑连接的建立、传输层寻址、数据传输、传输连接释放、流量控制、拥塞控制、多路复用和解复用、崩溃恢复等服务。传输层中最为常见的两个协议分别是传输控制协议TCP和用户数据报协议UDP。

二、传输层功能和端口范围

2.1、传输层功能

传输层功能:为相互通信的应用进程提供了逻辑通信

IP协议:提供主机之间的逻辑通信

TCP/UDP协议:提供进程之间的逻辑通信

2.2、三类端口

       端口,占有16位,其大小也就有65536个,是从0~65535.也就是一台计算机有65535个端口,主机之间的通讯,也就是应用进程之间的通讯,都要依靠端口,一个进程对应一个端口。

       1)熟知端口:0-1023, 也就是一些固定的端口号,比如http使用的80端口,意思就是在访问网址时,我们访问服务器的端口就是80,然后服务器那边传网页的数据给我们。

  2)登记端口:1024-49151,比如微软开发了一个系统应用,该应用在通讯或使用时,需要使用到xxx端口,那么就要去登记一下这个端口,以免有别人公司的应用使用同一个端口号,例如,windows系统中的3389端口,就是用来实现远程连接的,就固定了这台计算机如果要使用远程连接服务,就打开3389端口,别人就能使用远程连接连你了,默认是不打开的。

  3)客户端端口:49152-65535,一般我们使用某个软件,比如QQ,等其他服务,随机拿这个范围内的端口,而不是去拿前面哪些固定的,拿到等通讯结束后,就会释放该端口。

二、UDP协议

2.1、UDP协议特点

  1. 无连接,即发送数据之前不需要建立连接。
  2. 使用尽最大努力交付,即不保证可靠交付,同时也不使用拥塞控制
  3. 面向报文,很适合多媒体通信的要求
  4. 支持一对一、一对多、多对一和多对多的交互通信
  5. 首部开销小,只有8个字节

2.2、UDP报文格式

2.3、UDP首部格式

 

  源端口号:占16位,源主机的应用进程所使用的端口号。

  目标端口号:占16位,目标主机的应用进程所使用的端口号,也就是我们需要通信的目标进程。

  UDP(包)报长度:UDP用户数据报的长度,数据部分+UDP首部之和为UDP报长度。

  检验和:检验和是为了提供可靠的 UDP 首部和数据而设计,这里提供可靠的UDP首部,是因为一个进程可能接受多个进程过来的报文,是通过 “源 IP 地址”、“目的 IP 地址”、“协议号”、“源端口号”、“目标端口号”五项内容来进行区分的,检测可靠,指的是哪个报文要传入这个端口。

  UDP伪首部:就是拿到IP层的一些数据,因为要进行检验和,就必须要有这些数据。其中检验的算法跟IP层中检验首部的办法是一样的。

2.4、使用UDP协议的例子

       在选择使用协议的时候,选择UDP必须要谨慎。在网络质量令人十分不满意的环境下,UDP协议数据包丢失会比较严重。但是由于UDP的特性:它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。比如我们聊天用的ICQ和QQ就是使用的UDP协议。

  1)应用层协议中DNS,也就是根据域名解析ip地址的一个协议,他使用的就是UDP。

  2)DHCP,这个是给各电脑分配ip地址的协议,其中用的也是UDP协议。

  3)IGMP,我们说的多播,也使用的UDP,在多媒体教师,老师拿笔记本讲课,我们在下面通过各自的电脑看到老师的画面,这就是通过UDP传输数据,所以会出现有的同学卡,有的同学很流畅,就是因为其不可靠传输,但是卡一下,对接下来的观看并没有什么影响。

三、TCP协议

3.1、TCP协议概述

       TCP旨在适应支持多网络应用的分层协议层次结构。 连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。原则上,TCP应该能够在从硬线连接到分组交换或电路交换网络的各种通信系统之上进行操作。TCP协议是面向连接的、点对点的、全双工的、可靠传输、流量控制,拥塞控制、面向字节流传输等很多优点的协议。其最终功能和UDP一样,在端和端之间进行通信。

3.2、TCP协议具体功能

       1)当应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,TCP则把数据流分割成适当长度的报文段,最大传输段大小通常受该计算机连接的网络的数据链路层的最大传送单元限制。之后TCP把数据包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。

       2)TCP为了保证报文传输的可靠,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的字节发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据将会被重传。在数据正确性与合法性上,TCP用一个校验和函数来检验数据是否有错误,在发送和接收时都要计算校验和;

  3)在保证可靠性上,采用超时重传和捎带确认机制。

  4)在流量控制上,采用滑动窗口协议,协议中规定,对于窗口内未经确认的分组需要重传。

       5)在拥塞控制上,采用TCP拥塞控制算法(也称AIMD算法)。该算法主要包括三个主要部分:

  1.  加性增、乘性减;
  2.  慢启动;
  3.  对超时事件做出反应。

3.3、TCP报文段首部格式

       1)源端口号

  2)目标端口号

  3)序号seq:因为在TCP是面向字节流的,他会将报文都分成一个个字节,给每个字节进行序号编写,比如一个报文有900个字节组成,那么就会编成1-900个序号,然后分部分来进行传输。比如第一次传,序号就是1,传了50个字节, 那么第二次传,序号就为51,所以序号就是传输的数据的第一个字节相对所有的字节的位置

  4)确认号ack:如刚说的例子,第一次传了50个字节给对方,对方也会回应你,其中带有确认应答,就是告诉你下一次要传第51个字节来了,所以这个确认号就是告诉对方要传第多少个字节。

  5)数据偏移:4位二进制,每位代表4个字节,所以最大偏移为15x4(字节)=60个字节,TCP首部固定20字节,所以选项部分做多40字节。

  6)保留:留给以后用。

  7)控制位:目前有的控制位为6个

    URG:紧急,当URG为1时,表名紧急指针字段有效,标识该报文是一个紧急报文,传送到目标主机后,不用排队,应该让该报文尽量往下排,让其早点让应用程序给接受。

    ACK:确认,当ACK为1时,确认序号才有效。当ACK为0时,确认序号无效

    PSH:推送,当为1时,当遇到此报文时,会减少数据向上交付,本来想应用进程交付数据是要等到一定的缓存大小才发送的,但是遇到它,就不用在等足够多的数据才向上交付,而是让应用进程早点拿到此报文,这个要和紧急分清楚,紧急是插队,但是提交缓存大小的数据不变,这个推送就要排队,但是遇到他的时候,会减少交付的缓存数据,提前交付。

    RST:复位,报文遇到很严重的差错时,比如TCP连接出错等,会将RST置为1,然后释放连接,全部重新来过。

    SYN:同步,在进行连接的时候,也就是三次握手时用得到,配合ACK一起使用。

    FIN:终止,在释放连接时,也就是四次挥手时用的。

  8)窗口:指发送报文段一方的接受窗口大小,用来控制对方发送的数据量(从确认号开始,允许对方发送的数据量)。

  9)检验和:检验首部和数据这两部分,和UDP一样,需要拿到伪首部中的数据来帮助检测

      10)紧急指针:设置紧急报文的结束字节。假设紧急指针为50,则数据报文中1~50字节为需要紧急数据的字节。

    11)选项:长度可变,介绍一种选项,最大报文段长度,MSS。 能够告诉对方TCP,我的缓存能接受报文段的数据字段的最大长度是MSS个字节。如果没有使用选项,那么首部固定是20个字节。

       12)填充:就是为了让其成为整数个字节

3.4、XP系统访问Web站点序号和确认号举例:

分析:源端口和目标端口因为应用程序没有重新设置,所以不会改变。

       xp系统向web站点发送第一个数据包,数据部分为1~203,因为是第一次发送且没有接收到应答,所以序号和确认号都为1。

       web站点返回的第一个数据包,因为是第一次给xp系统发送报文,所以序号为1,上一个接收到的数据包最后一个字节为203,所以确认号变为204。

       web站点返回的第二个数据包,因为第一个数据包没有携带消息且没有接收到应答,所以序号和确认号不变,为1和204。

       web站点返回的第三个数据包,因为没有接收到应答,所以确认号不变为204,因为上一个接收到的数据包最后一个字节为1460,所以确认号变为1461。

       xp系统向web站点发送第二个数据包,上一个接收到的数据包最后一个字节为2053,所以确认号变为2054,上一个发送的数据包最后一个字节为203,所以序号变为204。

3.5、三次握手

  1. TCP服务器进程先创建传输控制块TCB,时刻准备接受客户进程的连接请求,此时服务器就进入了LISTEN(监听)状态;
  2. TCP客户进程也是先创建传输控制块TCB,然后向服务器发出连接请求报文,这是报文首部中的同部位SYN=1,同时选择一个初始序列号 seq=x ,此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。
  3. TCP服务器收到请求报文后,如果同意连接,则发出确认报文。确认报文中应该 ACK=1,SYN=1,确认号是ack=x+1,同时也要为自己初始化一个序列号 seq=y,此时,TCP服务器进程进入了SYN-RCVD(同步收到)状态。这个报文也不能携带数据,但是同样要消耗一个序号。
  4. TCP客户进程收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=y+1,自己的序列号seq=x+1,此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态。TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号。
  5. 当服务器收到客户端的确认后也进入ESTABLISHED状态,此后双方就可以开始通信了。

3.6、四次挥手

  1. 客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
  2. 服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
  3. 客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
  4. 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
  5. 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意:此时TCP连接还没有释放,必须经过2∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
  6. 服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

3.7、可靠传输

       通过数据编号和积累确认、以字节为单位的滑动窗口、超时重传、快速重传这四个方面来达到可靠传输的目的。

  1)数据编号:将每个字节进行编号,有900个字节,就从1到900进行编号

     积累确认:服务器端不是接收到一个字节就发一个确认,那样效率太低,而是当接收到4,5个时,再发送一个确认,确认之前的数据就算发送成功。

  2)滑动窗口:这个跟在数据链路层讲个滑动窗口一样。每次能发送的数据是在此窗口中的,接到了多少数据,就往后滑多少数据

  3)超时重传:这个也在链路层讲过,如果等待一段时间后,还没接收到确认报文,那么就重新传输

  4)快速重传:在滑动窗口中的应用,比如传了1234   6五个数据到服务器端,原方法是在数据4之后的所有数据度要重新传,而快速重传就只需要等待传了5这个序号,就可以继续往下接收数据了。

3.8、流量控制

3.8.1、什么是流量控制?  

       在传输层中,有接受缓存和发送缓存,所以每次发送数据过去另一端时,都会把这些数据给带过去,让对方知道自己的这两个缓存的大小,然后来合理的设置自己的发送窗口的大小,如果对方的缓存快满了,对方在传送数据过来的时候,就会告诉自己,少发一点数据过来,自己就设置滑动窗口小一点,让对方有缓冲的机会,而不会导致缓存溢出,不让自己的报文被丢弃。

3.8.2、用什么方式进行流量控制?

  1. 利用滑动窗口机制可以很方便的在TCP连接上实现对发送方的流量控制。
  2. TCP的窗口单位是字节,不是报文段,发送方的发送窗口不能超过接收方给出的接收窗口的数值。

  1. 接收方的主机N进行了三次流量控制,第一次把窗口减小到rwnd  =300。
  2. 第二次又减小到rwnd = 100。
  3. 最后减到rwnd = 0,即不允许发送方再发生数据了。
  4. 这种使发送方暂停发送的状态将持续到主机B重新发出一个新的窗口值为止。
  5. B向A发送的三个报文段都设置了ACK = 1,只有在ACK = 1时确认号字段才有意义。

3.8.3、以上处理的不足

  死锁问题

  1. B向A发送了零窗口的报文段后不久,B的接收缓存又有了一些存储空间。于是B向A发送了rwnd = 400的报文段,然而这个报文段在传送过程中丢失了。
  2. A一直等待收到B发送的非零窗口的通知,而B也一直等待A发送的数据,如果没有其他措施,这种相互等待的死锁局面将一直持续下去。

3.8.4、解决方法

  1. TCP为每一个连接设有一个持续计时器。
  2. 只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器。
  3. 若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带1字节的数据),而对方就在确认这个探测报文时给出了现在的窗口值。
  4. 如果窗口值仍然是零,那么收到这个报文段的一方就重新设置持续计时器。
  5. 如果窗口不是零,那么死锁的僵局就可以打破了。

3.8.5、三种TCP传输机制

  1. TCP维持一个变量,它等于最大报文段长度MSS。只要缓存中存放的数据达到了MSS字节时,就组装成一个TCP报文段发送出去。
  2. 发送方的应用进程指明要求发送报文段,即TCP支持的推送(push)操作。
  3. 发送方的一个计时器期限到了,这时就把当前已有的缓存数据装入报文段(但长度不超过MSS)发送出去。

3.9、拥塞控制

3.9.1、什么是拥塞控制

       虽然TCP有了滑动窗口这个大杀器, 能够高效可靠的发送大量的数据. 但是如果在刚开始阶段就发送大量的数据, 仍然可能引发问题。因为网络上有很多的计算机,可能当前的网络状态就已经比较拥堵。在不清楚当前网络状态下, 贸然发送大量的数据, 是很有可能引起雪上加霜的。TCP引入慢启动机制, 先发少量的数据, 探探路, 摸清当前的网络拥堵状态, 再决定按照多大的速度传输。

3.9.2、拥塞控制要考虑的因素

  1. 拥塞控制所作的都有一个前提,就是网络能够承受现有的网络负荷。
  2. 拥塞控制是一个全局性的过程,涉及到所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。
  3. TCP连接的端点只要迟迟不能收到对方的确认信息,就猜想在当前网络中的某处可能发生了拥塞,但这时却无法知道拥塞到底发生在网络的何处,也无法知道发生拥塞的具体原因。

3.9.3、拥塞控制的方法:

  1. 慢开始
  2. 拥塞避免
  3. 快重传
  4. 快恢复

前提:

1) 数据是单方向传送的,对方只传送确认报文。

2) 接收方总是有足够大的缓存空间,因而发送窗口的大小由网络的拥塞程度来决定。

3.9.4、慢开始和拥塞避免

发送方控制拥塞窗口的原则

  1. 只要网络没有出现拥塞,拥塞窗口就可以再增大一些,以便把更多的分组发送出去,这样就可以提高网络的利用率。
  2. 但只要网络出现拥塞或有可能出现拥塞,就必须把拥塞窗口减小一些,以减少注入到网络中的分组数,以便缓解网络出现的拥塞。

慢开始算法的思路

  1. 当主机开始发送数据时,由于并不清楚网络的负荷情况,所以如果立即把大量数据字节注入到网络,那么就有可能引起网络发生拥塞。
  2. 经验证表明,较好的办法是先探测一下,即由小到大逐渐增大发送窗口,也就是说,由小到大逐渐增大拥塞窗口的数值。

  1. 在一开始发送方先设置cwnd = 1,发送第一个报文段M1,接收方收到后确认M1
  2. 发送方收到对M1的确认后,把cwnd从1增大到2,于是发送方接着发送M2和M3两个报文段,接收方收到后发回对M2和M3的确认
  3. 发送方每收到一个对新报文段的确认(重传的不算在内)就使发送方的拥塞窗口加1,因此发送方在收到两个确认后,cwnd就从2增大到4,并可发送M4~M7共4个报文段
  4. 使用慢开始算法后,每经过一个传输轮次,拥塞窗口cwnd就加倍。

拥塞避免算法的思路

 拥塞避免算法的思路是让拥塞避免窗口cwnd缓慢的增大,即每经过一个往返时间就把发送方的拥塞窗口cwnd加1。

  1. 假定cwnd等于10个MSS的长度,而MSS是1460字节,发送方可一连发送14600字节(即10个报文段)。
  2. 假定接收方每收到一个报文段就发回一个确认。
  3. 于是发送方每到一个新的确认,就把拥塞窗口稍微增大一些,即增大0.1 MSS = 146字节。
  4. .经过一个往返时间RTT(或一个传输轮次)后,发送方共收到10个新的确认,拥塞窗口就增大了1460字节,正好是一个MSS的大小。)
  5. 不是像慢开始阶段那样加倍增长。因此在拥塞避免阶段就有“加法增大”AI的特点。
  6. 这表明在拥塞避免阶段,拥塞窗口cwnd按线性规律缓慢增长,比慢开始算法的拥塞窗口增长速率缓慢得多。

慢开始和用思安避免算法实现举例

3.9.5、快重传和快恢复

什么是快重传

  1. 采用快重传算法可以让发送方尽早知道发生了个别报文段的丢失。
  2. 快重传算法首先要求接收方不要等待自己发送数据时才进行捎带确认,而是要立即发送确认,即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认。

            1)接收方收到了M1和M2后都分别及时发出了确认。

       2)现假定接收方没有收到M3的但收到了M4,本来接收方可以什么都不做。

       3)但按照快重传算法,接收方必须立即发送对M2的重复确认,以便让发送方及早知道接收方没有收到报文段M3。

       4)发送方接着发送M5和M6,接收方收到后也仍要再次分别发出对M2的重复确认。

       5)这样,发送方共收到了接收方的4个对M2的确认,其中后3个都是重复确认。

       6)快重传算法规定,发送方只要一收到3个重复确认,就知道接受方确实没有收到报文段M3,因而应当立即进行重传,这样就不会出现超时,发送方也不就会认为出现了网络拥塞。

快恢复的两个特点

       1)当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把慢开始门限减半,这是为了预防网络发生拥塞。

       2)由于发送方现在认为网络很可能没有发生拥塞,因此现在不执行慢开始算法,而是把cwnd值设置为慢开始门限减半后的值,然后开始执行拥塞避免算法,是拥塞窗口的线性增大。

 

借鉴博文:https://www.cnblogs.com/zhangyinhua/p/7610922.html

                  https://blog.csdn.net/zgege/article/details/80445324

                  https://www.cnblogs.com/ppzhang/p/10506237.html

                  https://blog.csdn.net/qq_38950316/article/details/81087809

                  http://www.pianshen.com/article/2916702456/

                  https://blog.csdn.net/qzcsu/article/details/72861891

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值