计网学习笔记———第四章:运输层

两台主机的通信就是两台主机的应用进程互相通信端到端的通信是应用进程之间的通信。

网络层主机之间提供逻辑通信,运输层应用进程提供端到端的逻辑通信。

两个主要协议:

UDP(User Datagram Protocol):用户数据报协议

TCP(Transmission Control Protocol):传输控制协议

 

按照OSI的术语,两个对等运输实体在通信时传送的数据单位叫做运输协议数据单元。

但在TCP/IP体系中,则根据所使用的是TCP或UDP,分别称之为TCP报文段(segment)或UDP用户数据报。

 

UDP在传送数据之前不需要先建立连接。远地的运输层在收到UDP报文后,不需要给出任何确认。虽然UDP不提供可靠交付,但在某些情况下UDP却是一种最有效的工作方式。

 

TCP则提供面向连接的服务。在传送数据之前必须先建立连接,数据传送结束后要释放连接。TCP不提供广播或多播服务。由于TCP要提供可靠的、面向连接的运输服务,因此不可避免地增加了许多的开销,如确认、流量控制、计时器以及连接管理等。这不仅使协议数据单元的首部增大很多,还要占用许多的处理机资源。

 

复用:应用层所有的应用进程都可以通过传输层再传送到IP层(网络层)

分用:运输层从IP层收到发送给各应用进程的数据后,必须分别交付指明的各应用进程,这就是分用。

 

显然,给应用层的每个应用进程赋予一个非常明确的标志是至关重要的。

一般用,进程标识符(PID:16位二进制数)来标志,因为不同的操作系统使用不太能够格式的进程标识符,因此要保证不同os的计算机应用能够互相通信,就必须用统一的方法对TCP/IP体系的应用进程进行标志。

但是进程的创建和撤销都是动态的,通信一方几乎无法识别对方机器上的进程。另外,我们往往需要利用目的主机提供的功能来识别终点,而不需要知道具体实现这个功能的进程是哪一个。

解决这个问题的方法就是在运输层使用协议端口号,或简称为端口(port)。这就是说,虽然通信的终点是应用进程,但只要把所传送的报文交到目的主机的某个合适的端口,剩下的工作(即最后交付目的进程)就由TCP或UDP来完成。

 

这就和寄信一样,需要填写对方的地址(IP地址),还要加上姓名(端口号)。

 

服务器端常用端口(0---1023之间):

FTP  SSH  TELNET  SMTP  DNS  TFTP  HTTP  SNMP  SNMP(trap)  HTTPS

 21      22        23          25       53      69       80       161        162              443

客户端使用的端口号(1024---49151之间):

由于这类端口号仅在客户进程运行时才动态选择,因此又叫做短暂端口号。进程动态使用,通信的时候分配,不通信的时候给其他要通信的进程使用,因此没有熟知。

UDP:用户数据报协议,只是在IP的数据报服务上增加了很少的一点功能,就是复用和分用以及差错检测功能。

特点:

无连接,发送数据之前不需要建立连接(结束时也就没有释放),因此减少了开销和发送数据之前的时延。

UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态表。

UDP是面向报文的。UDP一次交付一个完整的报文。会降低IP层的效率。

UDP没有拥塞控制,因此网络出现的拥塞不会使源主机的发送效率降低。

UDP支持一对一,一对多、多对一和多对多的交互通信。

UDP首部开销小,只有8个字节,比TCP20个字节要短。

 

UDP的首部格式:两个字段,数据字段和首部字段。首部字段只有8个字节,由四个字段组成,每个字段都是两个字节。

四个字段分别为:源端口、目的端口、长度、检验和(检测传输中是否有错,有错就丢弃)

 

当运输层从IP层收到UDP数据报时,就根据首部中的目的端口,把UDP数据报通过相应的端口,上交最后的终点——应用程序。(整个过程就是UDP的分用功能)

 

TCP:传输控制协议

特点:

面向连接

每一条TCP连接只能有两个端点(endpoint),每一条TCP连接只能是点对点(一对一)。

TCP提供可靠交付的服务。通过TCP连接传送的数据,无差错、不丢失、不重复,并且按序到达。

TCP提供全双工通信。

面向字节流

套接字(socket) = 【 IP地址:端口号】

每一条TCP连接唯一地被通信两端的两个端点(即两个套接字)所确定

TCP传送的数据单元:报文段

一个TCP报文段分为首部和数据两部分,首部的前20个字节是固定的,后面有4n字节是根据需要而增加的选项。

首部固定部分各字段意义如下:

(1)源端口和目的端口:各占两个字节

序号:占4个字节,范围[0,2^32-1],共2^32个序号,在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置。

确认号:占4个字节,是期望收到对方下一个报文段的第一个数据字节的序号。若确认号=N,则表明:到序号N-1为止的所有数据都已正确收到。

数据偏移:占4位,它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。这个字段实际上是指出TCP报文段的首部长度。

保留:占6位,保留为今后使用,目前置为0.

紧急URG(URGent):当URG = 1 时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送,不要按原来排队顺序来传送了。例如用control+c紧急中断要运行很长一段时间的程序。当URG = 1 时,发送应用进程就告诉发送方的TCP有紧急数据要传送。于是发送方TCP就把紧急数据插入到本报文段数据的最前面。这时要与首部中紧急指针字段配合使用。

确认ACK(ACKnowledgement):仅当ACK = 1 时确认号字段才有效。当ACK = 0,确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置1

推送PSH(PuSH):当两个应用进程进行交互的通信时,有时在一端的应用进程希望在键入一个命令后立即就能够收到对方的响应。

复位RST(ReSeT):当RST = 1 时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立运输连接。RST置1还用来拒绝一个非法的报文段或拒绝打开一个连接。RST也称为重置位。

同步SYN(SYNchronization):在连接建立时用来同步序号。当SYN = 1 而ACK = 0 时,表明这是一个连接请求报文段。对方若同意连接,则应在响应的报文段中使SYN = 1 和ACK = 1。因此,SYN置为1就表示这是一个连接请求或连接接收报文。

终止FIN(FINis,“完”“终”的意思)用来释放一个连接。当FIN = 1时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。

窗口:占2个字节。窗口值时[0,2^16 - 1]之间的整数。窗口指的是发送本报文段的一方的接收窗口(而不是自己的发送窗口)。窗口值告诉对方:从本文段首部中的确认号算起,接收方目前允许对方发送的数据量(单位为字节)。之所以有这个限制,是因为接收方的数据缓存空间时有限的。总之,窗口值作为接收方让发送方设置其发送窗口的依据。

备注:接收方会把自己的接收窗口数值放在窗口字段中发送给对方。

检验和:占2个字节。检验和字段检验的范围包括首部和数据这两部分。

紧急指针:占2个字节。紧急指针仅在URG = 1时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据)。

选项:长度可变,最长可达40字节。当没有“选项”时,TCP的首部长度时20字节。TCP最初只规定了一种选项,即最大报文段长度MSS。MSS是每一个TCP报文段中的数据字段的最大长度。在连接建立的过程中,双方都把自己能够支持的MSS写入这一字段,以后就按照这个数值传送数据,两个传送方向可以有不同的MSS值。若主机未填,则默认为536字节长。因此,所有在互联网上的主机都应能接收的报文段长度是536+20(固定首部长度)= 556字节。随着互联网的发展,又增加了几个选项,如:窗口扩大选项、时间戳选项、选择确认(SACK)选项。窗口扩大选项时为了扩大窗口,TCP首部中窗口字段长度是16位,最大的窗口大小为64K(2^16)字节。窗口扩大选项占3字节,其中有一个字节表示移位值S,新的窗口值从16增大到(16 + S)。移位值允许使用的最大值是14,相当于窗口最大值增大到2^(16+14) - 1。窗口扩大选项可以在双方初始建立TCP连接时进行协商。如果连接的某一端实现了窗口扩大,当它不再需要扩大其窗口时,可发送S = 0的选项,使窗口大小回到16。时间戳选项占10字节,其中最主要的字段是时间戳值字段(4字节)和时间戳回送回答字段(4字节)。主要用来计算往返时间RTT、处理TCP序号超过2^32的情况。

超时重传:TCP的发送方在规定时间内没有收到确认就要重传已发送的报文段。

选择确认SACK(Selective ACK):若收到的报文段无差错,只是未按序号,中间还缺少一些序号的数据,至传送缺少的数据而不重传已经正确到达接收方的数据。

流量控制(flow control):让发送方的发送速率不要太快,要让接收方来得及接收。

TCP是面向连接的协议,TCP运输连接的建立和释放时每一次面向连接的通信中必不可少的过程,运输连接有三个阶段:连接建立、数据传送和连接释放。

TCP连接的建立采用客户服务器方式,主动发起连接建立的应用进程叫做客户(client),被动等待连接建立的应用进程叫做服务器(server)。

TCP的连接建立:称作握手,握手需要在客户和服务器之间交换三个TCP报文段

A运行的时TCP客户进程,B运行TCP服务器程序,最初都处于CLOSED状态,A主动打开连接,B被动打开连接。

一开始,B的TCP服务器进程先创建传输控制块TCB,准备接受客户进程的连接请求。然后服务器进程就处于LISTEN(收听)状态,等待客户的连接请求。如有,作出响应。

A的TCP客户进程也是首先创建传输控制模块TCB。然后,在打建立TCP连接时,向B发出连接请求报文段,这时首部中的同步位SYN = 1,同时选择一个初始序号seq = x这时,TCP客户进程进入SYN-SENT(同步已发送)状态。

B收到连接请求后,如同意建立连接,则向A发送确认。在确认报文段中应把SYN位和ACK位都置1,确认号是ack = x+1,同时也为自己选择一个初始序号seq = y。这时TCP服务器进程进入SYN-RCVD(同步收到)状态。

A收到B的确认后,还要向B给出确认。确认报文段的ACK置1,确认号ack=y+1,而自己的序号seq=x+1。

开始传送数据。

 

A为什么还要发送一次确认呢?

假定A发送第一个确认报文段,B没有收到,于是A又重新发送一个,第二次的成功了,建立了连接,现在假定A第一次发送的报文段没有丢失,而是在某些网络结点长时间滞留了,以致厌延误到连接释放以后的某个时间才到达B,这本来就是一个早已失效的报文段,但B收到此失效的请求报文后,如果不采取A再发送一个报文段的方法的话,B就误以为是一次新的连接。这样B就一直在等待A发送数据,会造成资源浪费。

 

TCP连接释放

数据传输结束后,通信的双方都可释放连接。

现在A和B都处于ESTABLISHED状态。A的应用进程先向其TCP发出连接释放报文段,并停止再发送数据,主动关闭TCP连接。首部终止控制位FIN置1,序号为seq = u,它等于前面已传送过的数据的最后一个字节的序号加1.这时A进入FIN-WAIT-1(终止等待1)状态,等待B的确认。

B收到连接释放报文段后即发出确认,确认号是ack = u+1,而这个报文段自己的序号是v,等于B前面已传送过的数据的最后一个字节的序号加1。然后B就进入人CLOSE-WAIT(关闭等待)状态。TCP服务器进程这时应通知高层应用进程,因而从A到B这个方向的连接就释放了,这时的TCP连接处于半关闭状态,即A已经没有数据要发送了,但B若发送数据,A仍要接收。

A收到来自B的确认后,就进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段。

若B已经没有向A发送的数据,其应用进程就通知TCP释放连接。这时B发出的连接释放报文段必须使FIN = 1。现假定B的序号为w(在半关闭状态B可能又发送了一些数据)。B还必须重复上次已发送过的确认号ack = u + 1。这时B就进入LAST-ACK(最后确认)状态,等待A的确认。

A在收到B的连接释放报文段后,必须对此发出确认。在确认报文段中把ACK置1,确认号ack = w + 1,而自己的序号时seq = u + 1,然后进入到TIME-WAIT(时间等待)状态。请注意:现在TCP连接还没有释放掉。必须经过时间等待计时器(TIME-WAIT timer)设置的时间2MSL后,A才进入到CLOSED状态。时间MSL叫做最长报文段寿命,为2分钟。因此,从A进入到TIME-WAIT状态后,要经过4分钟才能进入到CLOSED状态,才能开始建立下一个新的连接。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值