TCP通信协议

TCP是面向连接的、可靠的、基于字节流的传输层通信协议:

TCP通信协议

文章插图
面向连接:一定是一对一才能连接,不能像UDP协议可以一个主机同时向多个主机发送消息,即一对多是无法做到的
可靠的:无论的网络链路中出现了怎样的链路变化,TCP 都可以保证一个报文一定能够到达接收端
字节流:消息是没有边界的,所以无论消息有多大都可以进行传输 。并且消息是有序的,当前一个消息没有收到的时候,即使它先收到了后面的字节已经收到,那么也不能扔给应用层去处理,同时对重复的报文会自动丢弃
TCP头部格式
TCP通信协议

文章插图
序列号:在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小 。用来解决网络包乱序问题
确认应答号:指下一次「期望」收到的数据的序列号,发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收 。用来解决不丢包的问题
控制位:ACK:该位为 1 时,「确认应答」的字段变为有效,TCP 规定除了最初建立连接时的 SYN 包之外该位必须设置为 1RST:该位为 1 时,表示 TCP 连接中出现异常必须强制断开连接SYN:该位为 1 时,表示希望建立连接,并在其「序列号」的字段进行序列号初始值的设定FIN:该位为 1 时,表示今后不会再有数据发送,希望断开连接 。当通信结束希望断开连接时,通信双方的主机之间就可以相互交换 FIN 位置为 1 的 TCP 段
网络模型
谈一谈你对 TCP/IP 四层模型,OSI 七层模型的理解?
OSI参考模型
OSI(Open System Interconnect),即开放式系统互联 。一般都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网络互连模型 。ISO为了更好的使网络应用更为普及,推出了OSI参考模型 。其含义就是推荐所有公司使用这个规范来控制网络 。这样所有公司都有相同的规范,就能互联了 。
TCP通信协议

文章插图
TCP/IP五层模型
TCP/IP五层协议和OSI的七层协议对应关系如下:
TCP通信协议

文章插图
TCP状态
TCP通信协议

文章插图
CLOSED: 表示初始状态
LISTEN: 表示服务器端的某个SOCKET处于监听状态,可以接受连接了
SYN_RCVD: 表示接收到了SYN报文
SYN_SENT: 表示客户端已发送SYN报文
ESTABLISHED:表示连接已经建立了
TIME_WAIT:表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了
CLOSING: 表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文 。如果双方几乎在同时close一个SOCKET的话,那么就出现了双方同时发送FIN报 文的情况,也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接
CLOSE_WAIT: 表示在等待关闭
如何在 linux 系统中查看 TCP 状态?
TCP 的连接状态查看,在 Linux 可以通过.NETstat -napt 命令查看:
TCP通信协议

文章插图
TIME_WAIT
① 为什么需要 TIME_WAIT 状态?
主动发起关闭连接的一方,才会有 TIME-WAIT 状态 。需要 TIME-WAIT 状态,主要是两个原因:
防止具有相同「四元组」的「旧」数据包被收到
保证「被动关闭连接」的一方能被正确的关闭,即保证最后的 ACK 能让被动关闭方接收,从而帮助其正常关闭
② TIME_WAIT 过多有什么危害?
如果服务器有处于 TIME-WAIT 状态的 TCP,则说明是由服务器方主动发起的断开请求 。过多的 TIME-WAIT 状态主要的危害有两种:
第一是内存资源占用
第二是对端口资源的占用,一个 TCP 连接至少消耗一个本地端口
第二个危害是会造成严重的后果的,要知道,端口资源也是有限的,一般可以开启的端口为 32768~61000,也可以通过如下参数设置指定
net.ipv4.ip_local_port_range
如果发起连接一方的 TIME_WAIT 状态过多,占满了所有端口资源,则会导致无法创建新连接 。
客户端受端口资源限制:
客户端TIME_WAIT过多,就会导致端口资源被占用,因为端口就65536个,被占满就会导致无法创建新的连接
服务端受系统资源限制:


推荐阅读