一、TCP/IP简述
TCP / IP 协议的标准化过程具有两大特点,一是具有开放性,二是注重实用性(能否实际运用)。
注:标准化(Standardization)是指制定技术标准并就其达成一致意见的过程。 标准往往是一份文件,用于确定统一的工程、设计或技术规范、准则、方法、过程或惯例。
OSI七层网络模型与TCP/IP四层网络协议模型
应用层(会话层以上的分层):针对特定应用的协议,把会话层表示层的功能集中到应用程序中实现。
表示层:设备固有数据格式和网络标准数据格式的转换。
会话层:通信管理。负责建立和断开通信连接,管理传输层以下的分层
传输层:有两个最具有代表性的协议 TCP和UDP。管理连个节点之间的数据传输,分清楚哪些程序与哪些程序在进行通信。负责可靠传输(确保数据被可靠地传送到目标地址)
互联网层(网络层):使用IP协议,基于IP地址转发分包数据。地址管理和路由选择,由操作系统提供
网络接口层(数据链路层):利用数据链路层进行通信,属于接口层。互连设备之间传送和识别数据帧
物理层(最底层):负责数据传输的硬件。以"0"、"1"代表电压的高低、灯光的闪灭,界定连接器和网线的规格。
三、TCP协议、滑动窗口机制和丢失重传机制
1. TCP首部中各个字段介绍:
发送端端口号,字段长16位
Destination Port 目标端口号:
接收端端口号,字段长16位
Sequence Number 序列号:
字段长32位。指的是发送数据的位置。每发送一次数据,就会累加一次该字段大小。序列号不会从0或1开始,而是建立在计算机生成的随机数作为其初始值,通过SYN包传给接收端主机。然后再将每转发过去的字节数累加到初始值上表示数据的位置。此外,在建立连接和断开连接时发送的SYN包和FIN包虽然不携带数据,但是也会作为一个字结增加对应的序列号。
Acknowledgement Number 确认应答号:
字段长32位。是指下一次应该接收到的数据的序列号,发送端收到这个确认应答后可以认为在这个序号以前(-1)的数据都已经被正常接收了。
Data Offset 数据偏移:
字段长4个字节(32位)。表示TCP所传的数据从哪个位置开始计算,也可以看作是TCP首部的长度。
Reserved 保留:
字段长4位。为了以后扩展使用,一般为0,不为0该包也不会被丢弃。
Control Flag 控制位:
CWR:为1拥塞窗口缩小。
ECE:为1通知通信对方,从对方到这边的网络有拥塞。
URG(少用):紧急。当 URG = 1 时,发送应用进程就告诉发送方 TCP 有紧急数据要传送,于是发送方 TCP 就把紧急数据插入到报文段的最前面,而紧急数据后面的数据仍然是普通数据。紧急指针(Urgent Pointer)就是表示本报文段中紧急数据的字节数(紧急数据结束后就是普通数据),即紧急数据末尾在报文段中的位置。当所有紧急数据都处理完,TCP 就告诉应用层序恢复到正常操作。值得注意的是,即使窗口大小为 0,也可发紧急数据。
ACK:当ACK=1时,确认应答的字段变为有效。TCP规定除了最初见建立连接时SYN包之外该位必需设置为1。
PSH(少用):当PSH=1时,推送。提醒发送方立即发送这段数据;提醒接收方立即将数据投递到应用层;赶快发,赶快收。为0时表示不需要立即传,而实现进行缓存。
RST:该位为1时表示TCP连接中出现异常必须强制断开连接。当对方发送一个设置为1的RST包,就会使通信强制断开连接。
SYN:用于建立连接,SYN=1时表示希望建立连接
FIN:该位为1时,表示今后不会再有数据发送,希望断开连接。
Window Size 窗口大小:
字段长16位。用于通知从相同的TCP首部的确认应答号所指位置开始能接收的数据大小(8位字节为单位)。TCP不允许发送超过此处所示大小的数据。为0表示发送窗口探测,了解最新窗口大小。这个数据必须是1个字节。
Checksum 校验和:
接收端接收到数据以后,从IP首部获取IP信息构造TCP伪首部,在进行校验和计算。由于校验和字段保存着除本字段以外的其他部分的和的补码值,因此如果计算校验和字段在内的所有数据的16位和以后,得出的结果是“16位全部为1”,说明收到数据是正确的。
目的:在有噪声干扰的通信途中如果出现错误,由数据链路的FCS检查出来。
Urgent Pointer 紧急指针:
字段长16位。只有在URG为1是有效。表示本报文段中紧急数据的指针。正确的来说,从数据部分的首位到紧急指针所示的位置为止为紧急数据,紧急指针指出了紧急数据的末尾在报文段中的位置。
Options 选项:
选项字段用于提高TCP的传输性能。因为根据数据偏移(首部长度)进行控制,所以其长度最大为40字节。另外该选项字段尽量调整其为32位的整数倍。
发送端在数据通信之前,通过TCP首部内容来发送一个SYN包来作为建立连接的请求,然后等待确认应答。如果对端发送来确认应答,则认为可以进行数据通信;相反,确认应答未能达到,就不会进行通信。此外,在通信结束时会进行断开连接的处理(FIN包)。一个连接的建立与断开,正常过程至少需要来回发送7个包才能完成。下图是TCP的三次握手和挥手。
在建立TCP连接的同时,也可以确认发送数据包的单位,称其为最大消息长度(MMS, Maximum Segment Size)。在理想的情况下,MMS正好是IP中不会被分片处理的最大数据长度。
TCP在发送大量数据时,是以MSS的大小将数据进行分割发送,重发时也是以MSS为单位。
MSS是在三次握手时,在两端主机之间被计算得出。发出建立连接时,会在TCP首部写入MSS字段,告诉对端接口能适应对应的MSS大小(如果某一方MSS被省略,取 536字节 = IP包长度(576) - IP首部(20)),然后从两者之间取较小的值使用。
4. 超时重发
指的是在重发数据之前,等待确认应答到来的那个特定时间间隔。如果超过这个时间仍未收到确认应答,发送端就会对数据进行重发。时间长短和网络环境有关。
5. 窗口控制机制
TCP以一个段进行一次确认应答的处理,这样的传输方式有一个缺点,那就是包的往返时间越长通信性能就越低。为了解决这个问题,TCP引入了窗口这个概念,即使在往返时间越长的情况下,他也能控制网络性能的下降。确认应答不是以每个分段,而是以更大的单位进行确认,转发的时间将会被大幅的缩短。也就是说,发送端主机发送了一个段后不必一直等确认应答,而是继续发送。
滑动窗口方式:
如下图所示,亮起的窗口,这个窗口的数据可以在未接收到确认应答的情况下继续发送,在没有接收到确认应答之前必须在缓存区保留这部分数据。
在滑动窗口以外的部分包括尚未发送的数据以及已经确认对端已收到的数据,当数据发送出去以后能如期收到确认应答就可以不用在进行重发,此时数据就可以从缓存区中清除。收到确认应答的情况下,将滑动窗口滑动到确认应答中的序列号的位置。这样可以顺序地将多个段同时发送以提高通信性能。这种机制就被成为滑动窗口控制。
在使用窗口控制中,如果出现段丢失该怎么办?
首先是考虑确认应答未能返回的情况,数据已经到对端,不需要重发,在没有使用窗口控制的时候都会被重发,而使用了窗口控制,某些确认应答即便丢失也无须重发。
四、TCP和UDP的相同点和不同点
TCP是一个面向连接的、可靠的协议,有流量控制、差错控制,传输效率比UDP高,它在实现了数据传输时的各种控制功能;当对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议,不利于视频会议等场合使用。
UDP是无连接的、不具有可靠性的数据报协议,没有复杂的控制机制,只提供传输层最基本的功能,处理既简单又高效,在传输过程中丢包,也不负责重传,但能随时发送数据;当对网络通讯质量要求不高的时候,分组的数据较少,要求网络通讯速度能尽量的快,如多波、广播通信以及视频通信等多媒体领域,这时就可以使用UDP。