传输层协议TCP/UDP、三次握手、窗口滑动
传输层协议分传输控制协议TCP(Transmission Control Protocol)和用户数据包协议UDP(User Datagram Protocol)
TCP和UDP的区别
TCP是一种面向连接的传输层协议,可提供可靠的传输服务。通信前要建立可靠的数据连接,数据传输时会有确认机制,安全性高,但是传输速率不如UDP。
UDP是一种面向无连接的传输层协议,传输可靠性没有保证。没有确认机制,是一种尽力而为的传输模式,对于没有收到的数据包会自动重传,进而速率比较快,太多网络应用都是使用UDP。
TCP报文格式


TCP协议网络层协议所以报文被封装在IP包中。
TCP数据段由TCP Header(头部)和TCP Data(数据)组成。TCP最多可以有60个字节的头部,如果没有Options字段,正常的长度是20字节。
常用字段。
16位源端口号:源主机的应用程序使用的端口号。
16位目的端口号:目的主机的应用程序使用的端口号。每个TCP头部都包含源和目的端的端口号,这两个值加上IP头部中的源IP地址和目的IP地址可以唯一确定一个TCP连接。
32位序列号:用于标识从发送端发出的不同的TCP数据段的序号。数据段在网络中传输时,它们的顺序可能会发生变化;接收端依据此序列号,便可按照正确的顺序重组数据。
32位确认序列号:用于标识接收端确认收到的数据段。确认序列号为成功收到的数据序列号加1。
4位头部长度:表示头部占32bit字的数目,它能表达的TCP头部最大长度为60字节。
16位窗口大小:表示接收端期望通过单次确认而收到的数据的大小。由于该字段为16位,所以窗口大小的最大值为65535字节,该机制通常用来进行流量控制。
16位校验和:校验整个TCP报文段,包括TCP头部和TCP数据。该值由发送端计算和记录并由接收端进行验证。
6位 预留:长度为6位,作为保留字段,暂时没有什么用处。
URG:长1位,表示紧急指针字段有效;
ACK:长1位,置位表示确认号字段有效;TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1
PSH:长1位,表示当前报文需要请求推(push)操作;
RST:长1位,置位表示复位TCP连接;
SYN:长1位,在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1. 因此,SYN置1就表示这是一个连接请求或连接接受报文。
FIN:长1位,用于释放TCP连接时标识发送方比特流结束;即完,终结的意思, 用来释放一个连接。当 FIN = 1时,表明此报文段的发送方的数据已经发送完毕,并要求释放连接。
TCP报文格式


- UDP报文分为UDP报文头和UDP数据区域两部分。报头由源端口、目的端口、报文长度以及校验和组成。UDP适合于实时数据传输,如语音和视频通信。相比于TCP,UDP的传输效率更高、开销更小,但是无法保障数据传输的可靠性。
- 使用UDP传输数据时,由应用程序根据需要提供报文到达确认、排序、流量控制等功能。
三次握手

首先由Client发出请求连接即 SYN=1 ACK=0 (请前面看头字段的介绍), TCP规定SYN=1时不能携带数据,但要消耗一个序号,因此声明自己的序号是 seq=x
然后 Server 进行回复确认,即 SYN=1 ACK=1 seq=b, ack=a+1,
再然后 Client 再进行一次确认,但不用SYN 了,这时即为 ACK=1, seq=x+1, ack=y+1.
四次挥手

TCP支持全双工模式传输数据,这意味着同一时刻两个方向都可以进行数据的传输。在传输数据之前,TCP通过三次握手建立的实际上是两个方向的连接,因此在传输完毕后,两个方向的连接必须都关闭。
- 主机A想终止连接,于是发送一个标识了FIN,ACK的数据段,序列号为a,确认序列号为b。
- 服务器A回应一个标识了ACK的数据段,序列号为b,确认序号为a+1,作为对主机A的FIN报文的确认。
- 服务器A也要终止连接,于是向主机A发送一个标识了FIN,ACK的数据段,序列号为b,确认序列号为a+1。
- 主机A回应一个标识了ACK的数据段,序列号为a+1,确认序号为b+1,作为对服务器A的FIN报文的确认
为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
确认机制:

TCP的可靠传输还体现在TCP使用了确认技术来确保目的设备是否收到了从源设备发来的数据,并且是准确无误的。目的设备接收到源设备发送的数据段时,会向源端发送确认报文,源设备收到确认报文后,继续发送数据段,如此重复。
如图所示,主机A向服务器A发送TCP数据段,为描述方便假定每个数据段的长度都是500个字节。当服务器A成功收到序列号是M+1499的字节以及之前的所有字节时,会以序列号M+1499+1=M+1500进行确认。另外,由于数据段N+3传输失败,所以服务器A未能收到序列号为M+1500以及后面的字节,因此服务器A还会再次以序列号M+1500进行确认。
流量控制:

如果发送端发送的数据大小超过了服务器的缓冲区大小,那么缓冲区会丢弃之后要进来的数据。同时返回一个缓冲区能接受的窗口大小给发送端,告诉发送端我只能这个窗口大小下处理数据,希望你下次发送能按照窗口大小来发送。
滑动窗口
由于TCP 是面向连接的协议, 可以保证数据传输的完整性和准确性, 当传输过程中发生丢包时, 接收方会要求发送方从断点处重传数据。
实例:“ 三次握手”的例子描述了一个典型的TCP 传输过程。TCP 可使用称为滑动窗口的方法获得更好的TCP 传输性能。在TCP“ 三次握手”的过程中, 两台主机交换传输窗口大小, 接收主机把它的接收窗口大小设置成和发送主机的传输窗口大小一致。窗口大小表明任何一次所能传输段的最大个数。窗口大小是通过TCP 协议的格式中“ 窗口”字段, 在传输给目标主机的每一个报文中给出的。
发送主机通过创建一个发送窗口, 以设置它的最大传输规模。例如, 如果发送主机设置
发送窗口的大小是6, 如下图1所示,
这意味着发送主机一次最多可连续发送6 个数据段, 此时必须得到目标主机确认后, 才能继续发送后续的数据段。

图1发送窗口为6 的数据段的传送
(1) 第一次连续发送6 个数据段后( 即1 至6 段) , 发送主机必须等待接收主机的确认。
假如接收主机只收到段1, 2 和5, 则接收主机发回包含有序列号为3 的段进行确认, 确认的是1 和2 段。此时, 发送主机的滑动窗口向右滑过两个确认的段, 7 和8 段出现在滑动窗口中。如图2 所示。

图2 发送窗口向右滑过两个确认的段
( 2 ) 发送主机又连续发送6 个数据段( 即3 至8 段) 。假定这6 段均被正确收到, 接收
主机发回包含有序列号为9 的段进行确认, 即表示9 段前的数据段均已正确收到, 期待第9段的发送。此时, 发送主机的滑动窗口向右滑过6 个确认的段, 9 至14 段出现在滑动窗口中, 如图3 所示。

图3 发送窗口向右滑过6 个确认的段
通过上例可以看出, 借助于滑动窗口能够提高TCP 数据的传输性能。因为TCP 无须对每一数据段进行确认, 只需要对发送一个窗口宽度的段确认一次。
参考文档:http://www.togogo.net/article/1351.html
https://www.cnblogs.com/shineyoung/p/10656914.html

浙公网安备 33010602011771号