目录
定义
协议规定
TCP连接
TCP头部格式
TCP和UDP
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793 定义。
面向连接
一对一连接,区别于UDP协议的一个主机同时向多个主机发消息,即一对多。
可靠的
无论网络链路中出现怎样的链路变化,TCP都可以保证一个报文一定能够到达接收端。
字节流
消息是没有边界的,所以无论消息大小都可以进行传输。消息是有序的,当前一个消息没有收到,即使先收到了后面的字节,那么也不能扔给应用层去处理,同时对重复的报文会自动丢弃。
- 数据分片:在发送端对用户数据进行分片,在接收端进行重组,由TCP确定分片的大小并控制分片和重组;
- 到达确认:接收端接收到分片数据时,根据分片数据序号向发送端发送一个确认;
- 滑动窗口:TCP使用的流量控制协议是可变大小的滑动窗口协议。TCP连接每一方的接收缓冲空间大小都固定,接收端只允许另一端发送接收端缓冲区所能接纳的数据,TCP在滑动窗口的基础上提供流量控制,防止较快主机致使较慢主机的缓冲区溢出;
- 超时重发:发送方在发送分片时启动超时定时器,如果在定时器超时之后没有收到相应的确认,重发分片;
- 失序处理:作为IP数据报来传输的TCP分片到达时可能会失序,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层;
- 重复处理:作为IP数据报来传输的TCP分片会发生重复,TCP的接收端必须丢弃重复的数据;
- 数据校验:TCP将保持它首部和数据的检验和,这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到分片的检验和有差错,TCP将丢弃这个分片,并不确认收到此报文段导致对端超时并重发。
TCP连接定义
RFC 793定义的连接:
Connections: The reliability and flow control mechanisms described above require that TCPs initialize and maintain certain status information for each data stream. The combination of this information, including sockets, sequence numbers, and window sizes, is called a connection.
简单来说,是用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括Socket、序列号和窗口大小称为连接。
- Socket:由IP地址和端口号组成
- 序列号:用来解决乱序问题等
- 窗口大小:用来做流量控制
TCP连接的确定
源地址、源端口、目的地址、目的端口
其中,源地址和目的地址的字段(32位)是在IP头部中,作用是通过IP协议发送报文给对方主机。
源端口和目的端口的字段(16位)是在TCP头部中,作用是告诉TCP协议应该把报文发送给哪个进程。
TCP的最大连接数
服务端通常固定在某个本地端口上监听,等待客户端的连接请求,客户端IP和端口是可变的,理论值计算为:
最大TCP连接数 = 客户端IP数*客户端端口数
对于IPv4,客户端IP数最多为2的32次方,客户端的端口数最多为2的16次方,也就是服务端单机最大TCP连接数,约为2的48次方。
当然,服务端最大并发TCP连接数并不能达到理论上限,受以下限制:
- 文件描述符限制,Socket是文件,所以首先要通过ulimit配置文件描述符的数目
- 内存限制,每一个TCP连接都要占用一定内存,操作系统的内存是有限的
TCP的固定包头为20个字节,每一行32bit(4Byte),5行。
源端口号和目的端口号
源端口和目的端口的字段(16位)是在TCP头部中,作用是告诉TCP协议应该把报文发送给哪个进程。
序列号
TCP中每传输的一个数据都有一个序号。因为如果数据太大,我们会将数据切割成不同的数据报,有序号后就不会因为数据包在网络停留时间不一而导致的接受顺序不一样使得数据出现乱序。序号占用32bit,当序号超出2^32-1的话从0重新开始记。 用于解决网络包乱序问题。
确认应答号
指下⼀次期望收到的数据的序列号,发送端收到这个确认应答以后可以认为在这个序号以前的数 据都已经被正常接收。用来解决不丢包的问题。
首部长度
是指TCP数据起始位置距离TCP报文起始位置的距离,一般情况下为报文首部长度20字节,但TCP首部有一个可选长度要注意。
保留
很明显就是现在没用,留给以后使用。
URG
当URG=1,表示该报文是紧急报文,因此发送方会将该报文放在最开头传输,要配合TCP首部紧急指针一起用。
ACK
ACK=1时确认号字段才有效,TCP规定,连接建立后所有传送的报文段都必须把ACK置为1。
PSH
当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应。在这种情况下,TCP就可以使用推送操作。
RST
当RST=1时,表明TCP连接中出现严重错误,必须释放连接,然后再重新建立运输连接。
SYN
在连接建立时用来同步序号,当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意时,则应在响应的报文段中使SYN=1和ACK=1,因此,SYN置1就表示这是一个连接请求或连接接受报文。
FIN
用来释放一个连接,当FIN=1时,表示此报文段的发送方的数据已发送完毕,并要求释放运输连接。
窗口大小
占2个字节,窗口指的是发送本报文段的一方的接收窗口,不是自己的发送窗口,告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量。窗口值作为接受方让发送方设置其发送窗口的依据,一般用来平衡双方的数据传输速率(带宽)不一致问题。
校验和
占2字节。校验和字段检验的范围包括首部和数据这两部分。
紧急指针
占2字节,紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数。当所有紧急数据处理完毕时,TCP就告诉应用程序恢复到正常操作。值得注意的是,即使窗口为0时也可发送紧急数据。
选项
可选
UDP简介
UDP不提供复杂的控制机制,利用IP提供面向无连接的通信服务。
UDP协议比较简单,头部只有8个字节(64位),UDP头部格式:
- 目标和源端口:告诉UDP协议应该把报文发给那个进程。
- 包长度:该字段保存了UDP首部的长度和数据的长度之和。
- 校验和:校验和是为了提供可靠的UDP首部和数据而设计。
TCP和UDP的区别
1.连接
- TCP是面向连接的传输层协议,传输数据前先要建立连接
- UDP是不需要连接,即刻传输数据
2.服务对象
- TCP是一对一的两点服务,即一条连接只有两个端点
- UDP支持一对一、一对多、多对多的交互通信
3.可靠性
- TCP是可靠交付数据的,数据可以无差错、不丢失、不重复、按需到达
- UDP是尽最大努力交付,不保证可靠交付数据
4.拥塞控制、流量控制
- TCP有拥塞控制和流量控制机制,保证数据传输的安全性
- UDP没有,即使网络非常拥堵,也不会影响UDP的发送速率
5.首部开销
- TCP首部长度较长,会有一定的开销,首部在没有使用选项字段时是20字节,如果使用了选项字段则会变长
- UDP首部只有8个字节,并且是固定不变的开销较小
6.传输方式
- TCP是流式传输,没有边界,但保证顺序和可靠
- UDP是一个包一个包的发送,是有边界的,但可能会丢包和乱序
7.分片不同
- TCP的数据大小如果大于MSS大小,则会在传输层进行分片,目标主机收到后,也同样在传输层组装TCP数据包,如果中途丢失了一个分片,只需要传输丢失的这个分片。
- UDP的数据大小如果大于MTU大小,则会在IP层进行分片,目标主机收到后,在IP层组装完数据,接着再传给传输层,但如果中途丢了一个分片,在实现可靠传输的UDP时则需要重新传所有的数据包,这样传输效率非常差,所以通常UDP的报文应该小于MTU。
TCP和UDP应用场景
由于TCP是面向连接,能保证数据的可靠性交付,因此经常用于:
- FTP文件传输
- HTTP、HTTPS
由于UDP面向无连接,它可以随时发送数据,再加上UDP本身的处理既简单又高效,因此常用于:
- 包总量较少的通信,如DNS、SNMP等
- 视频、音频等多媒体通信
- 广播通信
其它
UDP头部没有首部长度字段,TCP头部有首部长度字段,是因为TCP有可变长的选项字段,而UDP头部长度则是不会变化的,无需多一个字段去记录UDP的首部长度。
TCP负载数据长度
TCP数据长度=IP总长度-IP首部长度-TCP首部长度