TCP的基本认识
1.TCP头部格式
(1)源端口号,16位,发送方的端口号。
(2)目标端口号,16位,发送方的目标端口号。
(3)序列号:在建立连接时由计算机生成的随机数作为初始值,通过SYN包传给接收端主机,每发送一次数据,就累加一次该数据字节数的大小,用来解决网络包乱序问题。
(4)确认应答号:指下一次期望收到的数据的序列号,发送端收到这个确认应答号以后可以认为这个序号以前的数据已经被正常接收,用来解决不丢包的问题。
(5)首部长度,4位。没有任何选项字段的TCP首部长度为20字节;最多可以有60(15*4)字节的TCP首部。
(6)预留字段,都为0
(7)TCP标志位
- URG:该为1时,紧急指针(urgent pointer)有效,配合紧急指针使用
- ACK:该位为1时表示确认应答的字段为有效,TCP规定除了最初建立连接时的SYN包之外该位必须设置为1.
- PSH:该为1时,接收方应该尽快将这个报文段交给应用层
- RST:该位为1时,表示TCP连接中出现异常必须强制断开连接。
- SYC:该位为1时,表示希望建立连接,并在其序列号字段进行序列号初始值的设定。
- FIN:该位为1时,表示今后不会再有数据发送,希望断开连接,当通信结束希望断开连接时,通信双方的主句之间就可以相互交换FIN位置为1的TCP段。
(8)此字段用来进行流量控制,主要用于解决流控拥塞的问题。单位为字节数,这个值是本机期望一次接收的字节数。
(9)对整个TCP报文段,即TCP头部和TCP数据进行校验和计算,并由目标端进行验证。
(10)它是一个偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。
(11)32位Tcp选项:一般包含在三次握手中
2.为什么需要TCP协议?TCP工作在哪一层?
IP层是不可靠的,它不保证网络包的交付、不保证网络包的按序交付、不保证网络包中的数据完整性。如果需要保证网络数据包的可靠性,那么就需要传输层的TCP协议来负责,TCP是一个工作在传输层的可靠数据传输的服务,它能确保接收端接收的网络包是无损坏、无间隔、非冗余和按序的。
3.什么是TCP?
TCP是面向连接、可靠的、基于字节流的传输层通信协议。
- 面向连接:一定是一对一的才能够连接,不能像UDP协议可以一个主机同时向多个主机发送消息,也就是说一对多是不能做到的;
- 可靠的:无论网络链路中出现了怎样的链路变化,TCP都可以保证一个报文一定能够到达接收端;
- 字节流:消息是没有边界的,所以无论我们消息有多大都是可以进行传输的,并且消息是有序的,当前一个消息没有收到的时候,即使它先收到了后面的字节,也不能扔给应用层去处理。
4.什么是TCP连接?
用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括Socket、序列号和窗口大小成为连接。
- Socket:由IP地址和端口号组成;
- 序列号:用来解决乱序问题等;
- 窗口大小:用来做流量控制。
5.如何唯一确定一个TCP连接?
TCP四元组可以唯一的确定一个连接,包括:源地址、源端口、目的地址、目的端口。
源地址和目的地址的字段(32位)是在IP头部中,作用是通过IP协议发送报文给对方主机;源端口和目的端口的字段(16位)是在TCP头部中,作用是告诉TCP协议应该把报文发给哪个进程。
6.有一个IP的服务器监听了一个端口,它的TCP的最大连接数是多少?
服务器通常是固定在某个本地端口上监听,等待客户端的连接请求。
最大TCP连接数=客户端的IP数 * 客户端的端口数
对于IPv4,客户端的IP数最多为232,客户端的端口数最多为216,也就是服务器端单机最大TCP连接数约为248. 当然,服务端最大并发TCP连接数远不能达到理论上限:
- 文件描述符限制,Socket都是文件,所以首先要通过ulimit配置文件描述符的数目;
- 内存限制,每一个TCP连接都要占用一定的内存,操作系统是有限的。
7.UDP和TCP有什么区别?分别的应用场景是什么?
(1)UDP
UDP不提供复杂的控制机制,利用IP提供面向无连接的通信服务。UDP的头部格式:
- 目标端口和源端口:主要是告诉UDP协议应该把报文发给哪个进程;
- 包长度:保存UDP首部的长度跟数据的长度之和;
- 校验和:为了提供可靠的UDP首部和数据。
(2)TCP和UDP的区别
(3)TCP和UDP的应用场景
由于TCP是面向连接的,能够保证数据的可靠性交付,因此经常用于:FTP文件传输,HTTP/HTTPS;
由于UDP面向无连接,可以随时发送数据,再加上UDP本身的处理既简单又高效,因此经常用于:包总量较少的通信,如DNS、SNMP等,视频、音频等多媒体通信,广播通信。
8.为什么UDP头部没有首部长度字段,而TCP头部有首部长度字段?
原因是TCP有可变长的选项字段,而UDP头部长度是不会变化的,所以无需多一个字段去记录UDP的首部长度。
9.为什么UDP头部有包长度字段,而TCP头部没有包长度字段?
TCP中计算负载数据长度:
TCP数据的长度=IP总长度-IP首部长度-TCP首部长度
但是因为网络设备硬件设计和处理方便,首部长度需要时4字节的整数倍,所以为了补全UDP首部长度是4字节的整数倍才补充了包长度字段。