第2章 传输层:TCP、UDP 和 SCTP(上)

1. UDP(用户数据报协议):

        应用进程往一个UDP套接字写入消息,该消息随后被封装到一个UDP数据报,该UDP数据报进而又被封装到一个IP数据报,然后发送到目的地。

        每个数据报都有一个长度,这个长度由发送端写入数据报发送给接收端的应用程序。

        UDP提供无连接的服务,因为UDP客户与服务器之间不必存在任何长期的关系。是不可靠的传输协议,可以在应用程序中添置特性来确保可靠:如来自对端的确认、本端的超时与重传。

2. TCP(传输控制协议):

        特性是需要客户与服务器建立一对一连接,能确保可靠传输的字节流协议。

        TCP含有动态估算客户和服务器之间往返时间(round-trip time,RTT)的算法,以便它知道等待一个确认需要多少时间。

        TCP通过给其中每个字节关联一个序列号对所发送的数据进行排序。

       TCP提供流量控制。TCP总是告知对端在任何时刻它一次能够从对端接收多少字节的数据,这称为通告窗口(advertised window)。在任何时刻,该窗口指出接收缓冲区中当前可用的空间量,从而确保发送端发送的数据不会使接收缓冲区溢出。该窗口时刻动态变化:当接收到来自发送端的数据时,窗口大小就减小,但是当接收端应用从缓冲区读取数据时,窗口大小就增大。通告窗口大小减小到0是有可能的。

        TCP连接是全双工的。可以建立连接后转为单工连接。UDP可以是全双工的。

3. SCTP(流控制传输协议):

扫描二维码关注公众号,回复: 1688276 查看本文章

        SCTP在客户和服务器之间提供关联,并像TCP那样给应用提供可靠性、排序、流量控制以及全双工的数据传送。

        不同于TCP,SCTP是面向消息的,它提供各个记录的按序递送服务。每个记录都有一个长度,这个长度由发送端写入数据报发送给接收端的应用程序。像UDP一样可以保存消息边界。

        SCTP能够在所连接的端点之间提供多个流,每个流各自可靠地按序递送消息。一个流上某个消息的丢失不会阻塞同一关联其他流上消息的投递。而TCP是单一字节流,控制和数据通常都是通过相同的连接来共享的,如果出现字节丢失都将阻塞其后所有数据的传递,直到该丢失被修复为止。

        SCTP还提供多宿特性,使得单个SCTP端点能够支持多个IP地址。这样可以规避故障。

4. 面向报文和面向数据报:

        面向报文的传输方式是应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。因此,应用程序必须选择合适大小的报文。若报文太长,则IP层需要分片,降低效率。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。这也就是说,应用层交给UDP多长的报文 ,UDP就照样发送,即一次发送一个报文。

        面向字节流的话,虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序看成是一连串的无结构的字节流。TCP有一个缓冲,当应用程序传送的数据块太长,TCP就可以把它划分短一些再传送。如果应用程序一次只发送一个字节,TCP也可以等待积累有足够多的字节后再构成报文段发送出去。

       

5. TCP建立连接之三路握手:

        

        在客户机和服务器之间建立正常的TCP网络连接时,客户机首先发出一个SYN消息,服务器使用SYN+ACK应答表示接收到了这个消息,最后客户机再以ACK消息响应。ACK (Acknowledgement)即是确认字符,占据一个字节的序列号空间。

        SYN(同步序列编号)占据一个字节的序列号空间,所以每一个SYN的ACK中的确认号就是该SYN的序列号加1。上图中的J+1和K+1就是这个原因。

        每一个SYN可以含有多个TCP选项:

        》MSS选项:发送SYN的TCP一端使用该选项通告对端它的最大分节大小(max segment size),即它在本连接的每个TCP分节中愿意接受的最大数据量。发送端TCP使用接收端的MSS值作为所发送分节的最大大小。套接字选项TCP_MAXSEG可以提取和设置该TCP选项。

        》窗口规模选项:TCP的通告窗口最大65535,这是由于TCP首部相应字段只有16位决定的。为了扩大最大窗口,新增了该选项,它的意思是通告窗口左移的位数(0~14),所以最大提供1GB(65535 x 2^14)的最大窗口。TCP随它的SYN发送该选项,但是只在对端也随它的SYN发送该选项的前提下,它才能扩大自己窗口的规模。套接字选项SO_RCVBUF可以影响该TCP选项。

        》时间戳选项:该选项对高速网络连接是必须的。

6. TCP连接终止之四路挥手:

        

        FIN即finish,是结束连接时发送的分节,一个FIN也占据1个字节的序列号空间。每个FIN的ACK确认号就是这个FIN的序列号加1。发送FIN的情况有:调用close关闭连接,程序终止(意外或有意)。

        为什么TCP协议终止链接要四次?

        》当客户端调用close想要关闭发送数据口,就会发FIN给服务端。(当然也可以由服务端先执行主动close)

        》服务端收到客户端发送的FIN,表示收到了,就会发送ACK回复。

        》但是此时服务端可能还在处理上一次的请求,还有数据需要发送给客户端,所以这种情况下服务端不能立即调用close来关闭端口,所以往往是一段时间后,才调用close并发送一个FIN给客户端。

        》客户端收到服务端的FIN,就会发送ACK回复。

7. 5和6可以结合 TCP-HEADER 来查看:http://www.freesoft.org/CIE/Course/Section4/8.htm

8. TCP状态之TIME_WAIT状态:

        存在理由:

        》可靠地实现TCP全双工连接的终止,即执行所有必要的工作以彻底终止某个连接上两个方向的数据流。

        》允许老的重复分节在网络中消逝。

        说明1:在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。

        说明2:由说明1可知,在关闭TCP连接时的最后一次ACK发送后,该TCP并没有立即关闭,而是等待了2MSL如果没有再次收到FIN才默认关闭,此时是TCP处在TIME_WAIT状态。在该状态下,TCP不会给其(相同IP和同一端口)创建新的会话。看原文如下。




猜你喜欢

转载自blog.csdn.net/lc250123/article/details/80549610