TCP/IP是在传输层,主要解决数据如何在网络传输,HTTP是在应用层,主要解决如何包装数据。两者都是协议。
1 TCP/IP连接和断开过程
-
连接:经过三次握手(我要和你建立连接,你真的要和我建立连接么,我真的要和你建立连接,成功)建立连接:
-
第一次握手:客户端发送数据包(Client进入
SYN_SENT
状态) -
第二次握手:服务端确认数据包,服务端发送数据包给客户端(Server进入
SYN_RCVD
状态) -
第三次握手:客户端接收数据包确认,再发送数据包给服务端确认,确认连接(Client和Server进入
ESTABLISHED
状态),完成三次握手
-
-
断开:经过四次挥手(我要和你断开连接;好的,断吧。我也要和你断开连接;好的,断吧):
-
第一次挥手:客户端发送一个
FIN
(用来关闭Client到Server的数据传送,进入FIN_WAIT_1
状态) -
第二次挥手:服务端接收
FIN
并发送一个ACK给客户端,确认序列号(Server进入CLOSE_WAIT
半关闭状态,客户端不发送数据,但服务端有数据仍会发送) -
第三次挥手:客户端发送一个
FIN
(用来关闭Server到Client的数据传送,进入LAST_ACK
状态) -
第四次挥手:客户端接收
FIN
(Client进入TIME_WAIT
状态)并发送一个ACK
给服务端,确认序列号(Server进入CLOSED
状态),完成四次挥手
-
2 为什么TCP连接需要三次握手,断开四次挥手?
三次握手的目的是为了防止已失效的链接请求报文突然又传送到了服务端,因而产生错误。
-
正常情况:A发出连接请求,但因连接请求报文丢失而未受到确认,于是A再重传一次连接请求。后来收到了确认,建立了连接。数据传输完毕后,就释放了连接。A共发送了两个连接请求报文段,其中第一个丢失,第二个到达了B。没有“已失效的连接请求报文段”。
-
异常情况:A发出了第一个连接请求报文段并没有丢失,而是在某个网络节点长时间滞留了,以致延误到连接释放以后的某个时间才到达B。本来这时一个早已失效的报文段。但B受到此失效的连接请求报文段后,就误认为是A再次发出了一个新的连接请求,于是就向A发出确认报文段,同意建立连接。
假设不采用三次握手,那么只要B发出确认,新的连接就建立了。由于现在A并没有发出建立连接的请求,因此不会理睬B的确认,也不会向B发送数据。但B却以为新的运输连接已建立,并一直等待A发来数据。这样,B的很多资源就白白浪费。采用三次握手的办法可以防止上述现象发生。
四次挥手:
TCP协议是一种面向连接的、可靠的、基于字节流的传输层通信协议,TCP是全双工模式,这就意味这,当A向B发出FIN报文段时,只是表示A已经没有数据要发送了,而此时A还是能够接收到来自B发出的数据;B向A发出ACK报文段也只是告诉A,它自己知道A没有数据要发送了,但B还是能够向A发送数据。
3 TCP协议如何来保证传输的可靠性?
TCP提供面向连接的、可靠的字节流服务。其中,面向连接意味着两个使用TCP的应用(通常是一个客户和服务器)在彼此交换数据之前必须建立一个TCP连接。
在一个TCP连接中,仅有两方进行彼此通信;而字节流服务意味着两个应用程序通过TCP连接交换8bit字节构成的字节流,TCP不在字节流中插入记录标识符。
对于可靠性,TCP通过以下方式进行保证:
-
数据包校验:目的是检测数据在传输过程中的任何变化,若检验出包出错,则丢弃报文段并且不给出响应,这时TCP发送数据端超时后会重发数据
-
对失序数据包重新排序:既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达可能会失序。TCP将对失序数据进行重新排序,然后才交给应用层(即A端发送到B端后,TCP报文段可能会失序,这是为了能让B端正常确认,需要对TCP报文段重新排序)
-
丢弃重复数据:对于重复数据,能够丢弃重复数据
-
应答机制:当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常会推迟几分之一秒
-
超时重发:当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段
-
流量控制:TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送端缓冲区所能接纳的数据,这可以防止较快主机致使较慢主机的缓冲区溢出,这就是流量控制。TCP使用的流量控制协议是可变大小的滑动窗口协议
4 TCP/IP、HTTP/HTTPS、Socket、RTMP、RTSP
-
TCP建立连接后是长连接,HTTP是请求-响应操作(即客户端发送请求,服务端返回结果,一次HTTP请求),可以属于短连接
-
TCP/IP和HTTP的关系:如果单纯的TCP传输是没有任何意义的,因为传输到应用层数据无法识别,需要HTTP应用层协议对数据进行包装,然后用TCP传输到网络
-
Socket是对TCP的封装,不是协议而是编程接口,为了更方便使用TCP
-
Socket、TCP/IP、HTTP的关系:应用层HTTP协议基于传输层TCP协议,传输层TCP协议基于网络层IP协议,Socket只是针对TCP或UDP的编程接口
-
HTTP和HTTPS的区别:HTTP协议运行在TCP之上,明文传输,客户端与服务器端都无法验证对方身份;HTTPS是使用SSL(Secure Socket Layer)加密后的HTTP传输协议,运行于SSL上,SSL运行于TCP之上,是添加了加密和认证机制的HTTP。HTTPS的加密机制是一种共享密钥加密和公开密钥加密并用的混合加密机制。
-
端口不同:HTTP是80端口,HTTPS是443端口
-
资源消耗:和HTTP通信相比,HTTPS通信会由于加解密处理消耗更多的CPU和内存资源
-
开销:HTTPS通信需要证书,而证书一般需要向认证机构购买
-
-
TCP和UDP的区别:
-
TCP:
-
面向连接,需要经过三次握手,是可靠的协议
-
只支持点对点通信
-
面向字节流
-
有拥塞控制机制
-
首部开销20个字节,比UDP首部开销8个字节大,可传输大数据
-
-
UDP:
-
无连接的,是不可靠的协议
-
支持一对一、一对多、多对一、多对多的通信
-
面向报文
-
没有拥塞控制,适合媒体通信
-
开销比TCP小,传输的数据大小有限,但传输速率快
-
-
-
RTMP是应用层流媒体协议,通过TCP协议传输,RTMP传输的数据是消息,发送端将媒体数据封装成消息,然后把消息分割成消息块,分割后的消息块通过TCP协议发送,接收端把消息块重新组合成消息,然后对消息进行解封装就可以使用媒体数据了
-
RTSP是应用层流媒体协议,本身不传输数据,需要依赖于下层协议传输数据,比如TCP、UDP、RTP协议传输。