名词解析
TCP/IP协议: TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。
IP协议: 网际互连协议(Internet Protocol),是TCP/IP体系中的网络层协议。
TCP协议: 传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
SYN: 同步序列编号(Synchronize Sequence Numbers)。是TCP/IP建立连接时使用的握手信号。
ACK: ACK (Acknowledge character)即是确认字符,在数据通信中,接收站发给发送站的一种传输类控制字符。表示发来的数据已确认接收无误。
ACK、SYN和FIN这些大写的单词表示标志位,其值要么是1,要么是0;ack、seq小写的单词表示序号。
ISO网络七层模型:
TCP协议的三次握手
三次握手是建立连接的过程。
当客户端向服务端建立连接的时候,会先发送一包连接请求数据过去询问一下,能否与服务端建立连接,这包请求数据称为SYN包;
如果对端同意连接,则回复一包SYN+ACK包;
客户端收到之后,回复一包ACK包,然后连接就建立了。
由于在连接建立的过程中互相发送了三包数据,故称之为“三次握手”。
三次握手解决了网络信道不可靠的问题 。
如果只有两次握手的话,客户端发送一个SYN包后,该SYN包在某个网络节点产生了滞留,为了建立连接,客户端会重新发送一个SYN包,这次正常送达服务端,服务端收到之后会回复SYN+ACK包,然后服务端与客户端建立起了连接。
紧接着第一包数据阻塞的网络节点恢复正常,第一包SYN包送达服务端,让服务端误以为客户端又发起了新的连接,服务端回复SYN+ACK包,进入等待数据阶段,服务端认为是两个连接,而客户端认为是一个连接,就会造成状态不一致,所以三次握手本质上来说就是为了解决网络信道不可靠的问题。
TCP协议的四次挥手
处于连接状态的客户端和服务端,都可以发起关闭连接请求,此时就需要四次挥手来进行连接关闭。这个机制和三次握手一样,也是为了在不可靠的网络链路当中,进行可靠的连接断开确认。
假设客户端发起关闭连接请求,就需要向服务端发起一包FIN包,表示要关闭连接,自己进入终止等待1状态,这是第一次挥手;
服务端收到FIN包,发送一包ACK包,表示自己进入了关闭等待状态,客户端进入了终止等待2状态,这是第二次挥手;
服务端此时还可以发送未发送的数据,而客户端此时还可以接收数据;
等服务端发送完数据之后,向客户端发送一包FIN包,进入最后确认状态,这是第三次挥手;
客户端收到FIN包之后,向服务端回复一包ACK包,进入超时等待状态,经过了超时时间后关闭连接,而服务端收到ACK包后立刻关闭连接,这是第四次挥手。
为什么客户端需要等待超时时间?
因为需要保证对方已经收到了ACK包。假设客户端在发送了最后一包ACK包之后就释放了连接,一旦ACK包在网络中丢失,服务端将会一直停留在最后确认状态;假设客户端在发送了最后一包ACK包之后,等待一段时间,这时服务端会因为没有收到ACK包而重新发送FIN包,客户端就会响应这个FIN包,重新发送ACK包并且刷新超时时间
TCP和UDP的主要区别
UDP协议是基于非连接的,发送数据就是简单的把数据包封装一下,然后从网卡发出去,数据包之间并没有状态上的联系。
但是正因为这种简单的处理方式,导致它的性能损耗非常少,对于CPU,内存占用也远远小于TCP,但是对于网络传输过程中产生的丢包,UDP协议并不能保证,所以在传输稳定性上,UDP要弱于TCP 。
TCP:传输数据稳定可靠,适用于对网络通讯质量要求较高的场景,需要准确无误的传输给对方。例如传输文件、发送邮件、浏览网页等等
UDP:速度快,但是可能产生丢包,所以适用于对实时性要求较高,但是对少量丢包没有太大要求的场景,例如域名查询、语音通话、视频直播等等。UDP还有一个非常重要的应用场景就是隧道网络,例如VPN等