从IP层看,通信双方是两个主机。
但真正进行通信的实体是在主机中的进程,是这个主机中的一个进程和另一个主机中的一个进程在交换数据。
所以严格的讲,两个主机进行通信就是两个主机中的应用进程互相通信。
IP协议能把分组送到主机,但分组还停留在主机的网络层而没有交付给主机中的应用进程。
从运输层看,通信的真正端点并不是主机而是主机中的进程。即,端到端的通信是应用进程之间的通信。在一个主机中经常有多个应用进程同时分别和另一个主机中的多个应用进程通信。
运输层的重要功能:
协议
两个主要协议:
UDP在传送数据之前不需要先建立连接,远程主机的运输层收到UDP报文后,不需要给出任何确认。
TCP提供面向连接的服务。在传送数据之前必须先建立连接,数据传送结束后要释放连接。TCP不提供广播或多播服务。
运输层的端口
因特网上使用的计算机的操作系统种类很多,不同的操作系统又使用不同格式的进程标识符。为了使运行不同操作系统的计算机的应用进程能够互相通信,必须使用统一的方法对TCP/IP体系的应用进程进行标志,这种方法必须与特定操作系统无关。
但把一个特定机器上运行的特定进程指明为因特网上通信最后的终点还是不可行的。这是因为进程的创建和撤销都是动态的,通信的一方几乎无法识别对方机器上的进程。
另外,往往需要利用目的主机提供的功能来识别终点,而不需要知道具体实现这个功能的进程是哪一个。
解决方法是在运输层使用协议端口号,简称为端口(port)。也就是说,虽然通信的终点是应用进程,但只要把传送的报文交到目的主机的某一个合适的目的端口,剩下的工作就由TCP来完成。
TCP/IP的运输层用一个16位端口号来标志一个端口。端口号只具有本地意义,只是为了标志本计算机应用层中的各个进程在运输层交互时的层间接口。在因特网的不同计算机中,相同的端口号是没有关联的。16位的端口号可允许有65535个不同的端口号。
两个计算机中的进程互相通信,不仅需要对方的IP地址,还需要知道对方的端口号。
因特网上的计算机通信是采用客户-服务器方式,客户在发起通信请求时,必须知道对方服务器的IP地址和端口号。运输层的端口号分为两大类:
1、服务器端使用的端口号:又分为两类
2、客户端使用的端口号,数值1024~65535。这类端口号仅在客户进程运行时动态选择,又叫短暂端口号。通信结束就不存在了。
在IP之上增加很少的功能:
主要特点:
首部格式
数据字段和首部字段
首部字段由四个字段组成,每个字段的长度都是两个字节:
1、源端口 : 在需要回信时选用,不需要可全用0
2、目的端口 : 终点交付报文
3、长度 : UDP用户数据报的长度,最小值是8
4、检验和 : 检测UDP用户数据报在传输时是否有错,有错就丢弃
如果接收方UDP发现收到的报文中的目的端口号不正确,就丢弃该报文,并由ICMP发送“端口不可达”差错报文给发送方
UDP的检验和是把首部和数据部分一起都检验,IP数据报的检验和只检验IP数据报的首部
主要特点:
1、面向连接
2、每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的
3、提供可靠交付。无差错、不丢失、不重复、按序到达
停止等待协议
连续ARQ协议
4、提供全双工通信。TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据
5、面向字节流。“流”是指流入到进程或从进程流出的字节序列。TCP把应用程序交下来的数据堪称仅仅是一连串的无结构的字节流,不知道字节流的含义。
TCP连接的端点叫做套接字或插口
端口号拼接到IP地址即构成了套接字
套接字的表示方法是在点分十进制的IP地址后面写上端口号,中间用冒号或逗号隔开,例:192.3.4.5:80
套接字socket=(IP地址: 端口号)
每一条TCP连接唯一地被通信两端的两个端点(即两个套接字)所确定,即:
TCP连接::={socket1, socket2} = {(IP1: port1), (IP2, port2)}
TCP报文段首部的前20个字节是固定的,后面有4N字节是根据需要而增加的选项。最小20,最大60
1,2、源端口和目的端口:各占2字节。
3、序号:4字节。范围是 [ 0 , 2 32 − 1 ] [0,2^{32}-1] [0,232−1]。在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。序号字段值指的是本报文段所发送的数据的第一个字节的序号,也称作“报文段序号”
4、确认号:4字节。期望收到对方下一个报文段的第一个数据字节的序号。如B正确收到A发送的报文段,序号字段为501,数据长度为200,则数据序号分别为501~700,表明B正确收到A发送的到700为止的数据,因此B期望收到A的下一个数据序号为701。
确认号=N,就表明:到序号N-1为止的所有数据都已正确收到
5、数据偏移:4位。指出TCP报文段的数据起始处距离TCP报文段的起始处有多远,即指出TCP报文段的首部长度。
6、保留,6位。保留为今后使用,目前置为0
7、紧急URG,当URG=1,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据),而不按原先排队顺序来传送。
8、确认ACK,仅当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。TCP规定,连接建立后的所有传送报文段都必须把ACK置1。
9、10、复位RST,当RST=1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立运输连接。RST置1还用了拒绝一个非法的报文段或拒绝打开一个连接。
11、同步SYN,连接建立时用来同步序号。SYN=1而ACK=0时,表明是一个连接请求报文段。如果对方同意建立连接,响应报文段中使SYN=1和ACK=1。所以,SYN置1表示这是一个连接请求或连接接受报文。
12、终止FIN,用来释放一个连接。FIN=1,表示此报文段的发送方的数据已发送完毕,并要求释放运输连接。
13、窗口,2字节。是 [ 0 , 2 16 − 1 ] [0,2^{16}-1] [0,216−1]的整数。指发送本报文段的以方的接收窗口。窗口值告诉对方:从本报问段首部中的确认号算起,接收方目前运行对方发送的数据量。
14、检验和,2字节。检验和字段检验的范围包括首部和数据两部分。
15、紧急指针,2字节。仅在URG=1时才有意义,指出本报文段中的紧急数据的字节数。即使窗口为0也可以发送紧急数据。
16、选项,长度可变,最大40字节。
三个阶段:连接建立、数据传送、连接释放
B的TCP服务器进程先创建传输控制块TCB,准备接受客户端进程的连接请求,然后就处于listen的状态。
A的TCP客户进程也是首先创建传输控制模块TCB,然后向B发送连接请求报文。
TCB(Transmission Control Block)存储了每一个连接中的一些重要信息,如:TCP连接表,到发送和接收缓存的指针,到重传队列的指针,当前的发送和接收序号等等。
1、A发送连接请求:SYN=1,选择一个初始序号seq=x
2、B收到连接请求,如同意建立连接,向A发送确认:
SYN=1,ACK=1,seq=y,确认号ack=x+1
3、A收到B的确认,向B给出确认。ACK=1,确认号ack=y+1,主机的序号seq=x+1
1、A的应用进程先向其TCP发出连接释放报文段,并停止发送数据,主动关闭TCP连接。连接释放报文段首部:FIN=1,seq=u,序号等于前面已传送过的数据的最后一个字节的序号加1。
2、B收到连接释放报文段后即发出确认,确认号ack=u+1,seq=v,等于B前面已传送过的数据的最后一个字节的序号加1。
从A到B方向的连接就释放了
3、A收到B的确认后,等待B发出连接释放报文段
B连接释放报文段FIN=1,ack=u+1
4、A收到连接释放报文段,A确认,ACK=1,ack=w+1,seq=u+1