tcp/ip是个协议簇,里面包括很多协议:IP协议,IMCP协议,TCP协议,以及我们更加熟悉的http、ftp、pop3协议等等是一个网络。首先先了解下tcp/ip网络模型,借用了网友的图片
其中http是应用层的协议,TCP和UDP是传输层的协议。
TCP是传输控制协议,是连接可靠的,面向连接的,基于字节流的协议。
UDP是用户数据报协议,是不可靠,无连接,基于数据报的协议。
TCP需要三次握手建立连接,四次挥手断开连接。UDP是不管我发出的数据丢失不丢失,也不管我发出的数据顺序对不对,我发给你就完了。比如,视频,QQ。
TCP是需要一对一发送数据,因为是可靠连接,所以端对端需要保证双方的接收能力和发送能力正常,UDP是可以一对一,一对多发送数据。
三次握手是什么?为什么需要三次握手建立连接?
三次握手是tcp建立连接的过程。自己的理解的流程图如下:
为什么最后要发送一个确定的消息呢?解释这个问题也就是面试中常问的为什么要三次握手,两次握手和四次握手不行吗?下面来解释下为什么需要三次握手 :
上图说明了两次握手之后可以确定自身和客户端发送和接收能力正常,可以建立通信。在tcp连接的传输过程中,是需要序列号做可靠的传输或接收的,为了避免连接复用时无法分辨这个序列号是延迟还是旧连接的序列号,因此需要第三次握手来确定双方的初始序列号。也就是说我前两次握手我是能够正常通信的,但是第三次握手确定初始序列号恰恰规避了异常情况重新连接的时候,发过来的消息是上次的还是上上次的还是新的,容易混淆的问题。
正常情况下,三次握手建立tcp连接,然后可以进行通信了,断开连接需要四次挥手。
在第四次挥手结束之后,服务器收到请求就断开连接,之后客户端在两个最大报文通信时间之后也关闭请求。为什么会这样呢?
这个问题也很好理解,当客户端最终告诉服务器端断开确认的时候,他不知道自己的发出的指令是否能准确的一次性被服务器接收。假如服务器没有接收到(这已经耗费了一个报文的最大通信时间了),服务器端将会重新发起一个结束通话的指令(FIN)到客户端,客户端又接收到了服务器发来的结束通信指令将继续给服务器进行一个确认,有人会说那要是客户端发出的确认信息服务端没收到,而服务端重发的断开指令客户端也没收到怎么办,说实话我也无奈,遇到这种情况咱们干脆认为网确实不行了。