UDP(用户数据报协议)
1.UDP概述
(1)UDP无连接,发送数据前不需要建立连接
(2)UDP尽最大努力交付,即不保证可靠交付,主机不需要维持复杂的连接状态表
(3)UDP是面向报文的。作为发送方时,对应用层交付的报文,添加首部后就交付IP层,既不合并,也不拆分,而是保留报文边界。作为接收方时,对IP层交上来的UDP用户数据报,去除首部后原封不动的交付应用进程。UDP一次交付一个完整的报文。应用程序需要选择合适长度的报文,过长使IP层需要进行分片,过短使首部相对长度过大,两者都降低了IP层的效率。
(4)UDP无拥塞控制,网络出现的拥塞不会使源主机的发送速率降低。许多实时应用要求源主机以恒定速率发送数据,并允许在网络发生拥塞时丢失一些数据,但不允许数据有太大时延,UDP正好适合这种要求。
(5)UDP支持一对一、一对多、多对一、多对多的交互通信。
(6)UDP的首部开销少,只有8个字节。
UDP无拥塞控制,可能会引起网络产生严重的拥塞问题。有一些使用UDP的应用,需要对UDP进行改进,在不影响实时性的基础上,会使用增强可靠性的措施,如前向纠错或重传丢失报文。
2.UDP的首部格式
(1)源端口。需要对方回信时选用,不需要时可全用0。
(2)目的端口。在终点交付报文时必须使用。
(3)长度。最小长度8(仅有首部)。
(4)检验和。检测数据报在传输时是否有差错,有就丢弃。计算时会在数据报前增加12个字节的伪首部。伪首部仅用于计算检验和。
TCP(传输控制协议)
1.TCP概述
(1)TCP是面向连接的运输层协议。应用程序在使用TCP之前必须先建立TCP连接,传送数据完毕后,必须释放已建立的TCP连接。
(2)TCP连接只能是点对点的。
(3)TCP提供可靠交付的服务。通过TCP连接传送的数据,无差错、不丢失、不重复、按序到达。
(4)TCP提供全双工通信。TCP连接的两端都设有发送缓存和接收缓存,用来存放双向通信的数据。发送时,应用程序把数据传给TCP缓存后就可以做自己的事,TCP在合适的时候把数据发送出去。接收时,TCP把收到的数据存入缓存,上层的应用进程在合适的时候读取缓存中的数据。
(5)面向字节流。TCP中的“流”指流入进程或从进程流出的字节序列。TCP把应用程序交下来的数据看成一连串无结构的字节流。TCP并不知道所传送字节流的含义,不保证接收方应用程序收到的数据块和发送方发出的数据块具有对应大小的关系,但接收方应用程序收到的字节流和发送方发出的字节流完全一样。接收方的应用程序有能力识别字节流,把它还原成有意义的应用层数据。
TCP连接是虚连接,不是真正的物理连接。
TCP不关心应用进程把多长的报文送入TCP缓存中,而是根据对方给出的窗口值和当前网络拥塞的情况来决定一个报文段应包含多少字节。
2.TCP的连接
TCP的连接端点叫套接字(socket)或插口。每一条连接被两个端点(既两个套接字)所确定,即
TCP连接::={socket1, socket2} = {(IP1: port1), (IP2: port2)}
3.TCP运输连接管理
3.1.连接建立(三报文握手)
设A为TCP客户程序,B为TCP服务器程序,最初两端均处于CLOSED状态。A主动打开连接,B被动打开连接。
(1)A、B打开传输控制模块TCB
(2)①A向B发送请求报文段。此时同步位SYN = 1,选择一个初始序号seq = x。SYN报文段不能携带数据,消耗一个序号。TCP客户进程进入SYN-SENT状态。
(3)②B收到请求报文段后,如同意建立连接,向A发送确认。确认报文段中SYN与ACK位均置为1,确认号ack = x + 1,自己选择一个序号seq = y。此报文不能携带数据,同样要消耗一个序号。TCP服务器进程进入SYN-RCVD状态。
(4)③TCP客户进程收到B的确认后向B给出确认。ACK置1,确认号ack = y + 1,自己的序号为seq = x + 1。TCP连接建立,A进入ESTABLISHED状态,B收到A的确认后也进入ESTABLISHED状态。此报文段可以携带数据,不携带数据则不消耗序号。此时下一个数据报文段序号仍是seq = x + 1。
3.2.数据传送
3.3.连接释放(四报文握手)
A、B均处于ESTABLISHED状态。
(1)①A把连接释放报文段首部终止位FIN置1,序号seq = u(之前最后一个字节序号 + 1),A进入FIN-WAIT-1状态。FIN即使不携带数据也消耗一个字节。
(2)②B收到连接释放报文发出确认,确认号ack = u + 1,自己的序号seq = v(之前最后一个字节序号 + 1),B进入CLOSED-WAIT-1状态。此时TCP服务器进程通知高层应用进程,从A到B方向的连接释放,TCP连接处于半关闭状态。
(3)A收到B的确认后,进入FIN-WAIT-2状态。等待B的连接释放报文段。
(4)③若B没有要向A发送的数据,应用进程通知TCP释放连接。连接释放报文段FIN = 1。现B的序号seq = w,重复上一次确认号ack = u + 1。B进入LAST-ACK状态。
(5)④A收到B的连接释放报文段后对此发出确认。ACK置1,ack = w + 1,seq = u + 1。之后进入TIME-WAIT状态。等待2MSL后,进入CLOSED状态。