文章目录
- 概述
- UDP
- TCP
- 首部格式
- 连接管理
- 连接建立
- 连接释放
概述
从IP层看,通信双方是两个主机。
但真正进行通信的实体是在主机中的进程,是这个主机中的一个进程和另一个主机中的一个进程在交换数据。
所以严格的讲,两个主机进行通信就是两个主机中的应用进程互相通信。
IP协议能把分组送到主机,但分组还停留在主机的网络层而没有交付给主机中的应用进程。
从运输层看,通信的真正端点并不是主机而是主机中的进程。即,端到端的通信是应用进程之间的通信。在一个主机中经常有多个应用进程同时分别和另一个主机中的多个应用进程通信。
运输层的重要功能:
- 复用:在发送方不同的应用进程都有可以使用同一个运输层协议传送数据
- 分用:接收方的运输层在剥去报文的首部后能够把这些数据正确交付到目的应用进程
协议
两个主要协议:
- 用户数据报协议UDP(User Datagram Protocol) | RFC 768 | UDP用户数据报
- 传输控制协议TCP(Transmission Control Protocol) | RFC 793 | TCP报文段
UDP在传送数据之前不需要先建立连接,远程主机的运输层收到UDP报文后,不需要给出任何确认。
TCP提供面向连接的服务。在传送数据之前必须先建立连接,数据传送结束后要释放连接。TCP不提供广播或多播服务。
一些应用和应用层协议主要使用的运输层协议:
运输层的端口
因特网上使用的计算机的操作系统种类很多,不同的操作系统又使用不同格式的进程标识符。为了使运行不同操作系统的计算机的应用进程能够互相通信,必须使用统一的方法对TCP/IP体系的应用进程进行标志,这种方法必须与特定操作系统无关。
但把一个特定机器上运行的特定进程指明为因特网上通信最后的终点还是不可行的。这是因为进程的创建和撤销都是动态的,通信的一方几乎无法识别对方机器上的进程。
另外,往往需要利用目的主机提供的功能来识别终点,而不需要知道具体实现这个功能的进程是哪一个。
解决方法是在运输层使用协议端口号,简称为端口(port)。也就是说,虽然通信的终点是应用进程,但只要把传送的报文交到目的主机的某一个合适的目的端口,剩下的工作就由TCP来完成。
TCP/IP的运输层用一个16位端口号来标志一个端口。端口号只具有本地意义,只是为了标志本计算机应用层中的各个进程在运输层交互时的层间接口。在因特网的不同计算机中,相同的端口号是没有关联的。16位的端口号可允许有65535个不同的端口号。
两个计算机中的进程互相通信,不仅需要对方的IP地址,还需要知道对方的端口号。
因特网上的计算机通信是采用客户-服务器方式,客户在发起通信请求时,必须知道对方服务器的IP地址和端口号。运输层的端口号分为两大类:
1、服务器端使用的端口号:又分为两类
- 熟知端口号或系统端口号,数值0~1023,可在www.iana.org查到,指派给TCP/IP最重要的应用程序,让所有的用户都知道。
- 登记端口号,数值1024~49151。 是为没有熟知端口号的应用程序使用的。这类必须在IANA登记,以防止重复。
2、客户端使用的端口号,数值1024~65535。这类端口号仅在客户进程运行时动态选择,又叫短暂端口号。通信结束就不存在了。
UDP
在IP之上增加很少的功能:
- 复用
- 分用
- 差错检测
主要特点:
- 无连接,减少了开销和发送数据之前的时延
- 尽最大努力交付,即不保证可靠交付
- 面向报文,发送发的UDP对应用程序交下来的报文,添加首部后就向下交付给IP层。既不合并,也不拆分,保留这些报文的边界。
- 无拥塞控制
- 支持一对一、一对多、多对一、多对多交互通信
- 首部开销小,只有8字节,TCP有20字节
首部格式
数据字段和首部字段
首部字段由四个字段组成,每个字段的长度都是两个字节:
1、源端口 : 在需要回信时选用,不需要可全用0
2、目的端口 : 终点交付报文
3、长度 : UDP用户数据报的长度,最小值是8
4、检验和 : 检测UDP用户数据报在传输时是否有错,有错就丢弃
如果接收方UDP发现收到的报文中的目的端口号不正确,就丢弃该报文,并由ICMP发送“端口不可达”差错报文给发送方
UDP的检验和是把首部和数据部分一起都检验,IP数据报的检验和只检验IP数据报的首部
TCP
主要特点:
1、面向连接
2、每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的
3、提供可靠交付。无差错、不丢失、不重复、按序到达
-
停止等待协议
-
无差错情况,发送-确认-发送-确认······
-
出现差错
-
A超过一段时间仍没有收到确认,就认为刚才发送的分组丢失了,重传前面发送过的分组,这叫做超时重传。
-
要实现超时重传,要在发送完一个分组设置一个超时计时器,如果在超时计时器到期之前收到了对方的确认,就撤销以设置的超时计时器
-
确认丢失和确认迟到
- B发送的确认丢失,A重传数据,B又收到数据,会采取丢弃重复数据,向A发送确认 。
- B对分组的确认迟到,A会收到重复的确认,丢弃即可,B还会收到重复数据,同样丢弃,重传确认
-
-
连续ARQ协议
- 发送方维持发送窗口,位于发送窗口的分组都可以连续发送出去,不需要等待对方的确认,可提高信道利用率
- 连续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