http:是用于www浏览的一个协议。
tcp:是机器之间建立连接用的到的一个协议。
1、TCP/IP是个协议组,可分为三个层次:网络层、传输层和应用层。
在网络层有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。
在传输层中有TCP协议与UDP协议。
在应用层有FTP、HTTP、TELNET、SMTP、DNS等协议。
因此,HTTP本身就是一个协议,是从Web服务器传输超文本到本地浏览器的传送协议。
2、HTTP协议是建立在请求/响应模型上的。首先由客户建立一条与服务器的TCP链接,并发送一个请求到服务器,请求中包含请求方法、URI、协议版本以及相关的MIME样式的消息。服务器响应一个状态行,包含消息的协议版本、一个成功和失败码以及相关的MIME式样的消息。
HTTP/1.0为每一次HTTP的请求/响应建立一条新的TCP链接,因此一个包含HTML内容和图片的页面将需要建立多次的短期的TCP链接。一次TCP链接的建立将需要3次握手。
另外,为了获得适当的传输速度,则需要TCP花费额外的回路链接时间(RTT)。每一次链接的建立需要这种经常性的开销,而其并不带有实际有用的数据,只是保证链接的可靠性,因此HTTP/1.1提出了可持续链接的实现方法。HTTP/1.1将只建立一次TCP的链接而重复地使用它传输一系列的请求/响应
消息,因此减少了链接建立的次数和经常性的链接开销。
3、结论:虽然HTTP本身是一个协议,但其最终还是基于TCP的。不过,目前,有人正在研究基于TCP+UDP混合的HTTP协议。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
具体介绍
IP (网际协议) 在网络通信中,网络组件的寻址对信息的路由选择和传输来说是相当关键的。相同网络中的两台机器间的消息传输有各自的技术协定。LAN 是通过提供6字节的唯一标识符(“MAC”地址)在机器间发送消息的。SNA 网络中的每台机器都有一个逻辑单元及与其相应的网络地址。DECNET、AppleTalk 和 Novell IPX 均有一个用来分配编号到各个本地网和工作站的配置。
HTTP是超文本传输协议,是客户端浏览器或其他程序与Web服务器之间的应用层通信协议。在Internet上的Web服务器上存放的都是超文本信息, 客户机需要通过HTTP协议传输所要访问的超文本信息。HTTP包含命令和传输信息,不仅可用于Web访问,也可以用于其他因特网/内联网应用系统之间的通信,从而实现各类应用资源超媒体访问的集成
TCP (传输控制协议) 通过序列化应答和必要时重发数据包,TCP 为应用程序提供了可靠的传输流和虚拟连接服务。TCP 主要提供数据流转送,可靠传输,有效流控制,全双工操作和多路传输技术。
至于HTTP协议,它是TCP协议族中的一种。使用TCP的80端口
HTTP是应用层协议,TCP是传输层协议!数据包在网络传输过程中,HTTP被封装在TCP包内!!
TCP/UDP
TCP:在正式收发数据前必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来,过程非常复杂;
UDP:正式通信前不必与对方先建立连接,没有TCP的握手、确认、窗口、重传、拥塞控制等机制,不管对方状态就直接发送。
tcp协议和udp协议的差别
TCP |
UDP |
|
是否连接 |
面向连接 |
面向非连接 |
传输可靠性 |
可靠服务 |
无状态的传输协议,不可靠 |
连接点 |
只能是点到点 |
支持一对一,一对多,多对一和多对多的交互通信 |
速度 |
慢,效率低,占用系统资源高 无差错,不丢失,且保证数据顺序 |
快,资源要求少 易丢包,不保证顺序,尽最大努力交付 |
应用场合 |
传输少量数据,对可靠性要求较高的场合 浏览器,文件传输等 |
传送大量数据、对可靠性要求不高的场景 QQ语音 QQ视频 TFTP等 |
记住图即可
三次握手的过程
step1:第一次握手
建立连接时,客户端发送SYN包到服务器,其中包含客户端的初始序号seq=x,并进入SYN_SENT状态,等待服务器确认。(其中,SYN=1,ACK=0,表示这是一个TCP连接请求数据报文;序号seq=x,表明传输数据时的第一个数据字节的序号是x)。
step2:第二次握手
服务器收到请求后,必须确认客户的数据包。同时自己也发送一个SYN包,即SYN+ACK包,此时服务器进入SYN_RECV状态。(其中确认报文段中,标识位SYN=1,ACK=1,表示这是一个TCP连接响应数据报文,并含服务端的初始序号seq(服务器)=y,以及服务器对客户端初始序号的确认号ack(服务器)=seq(客户端)+1=x+1)。
step3:第三次握手
客户端收到服务器的SYN+ACK包,向服务器发送一个ACK包,其中包含序列号(seq=x+1),确认号为ack(客户端)=y+1,此包发送完毕,客户端和服务器进入ESTAB_LISHED(TCP连接成功)状态,完成三次握手。 随后server和client可以传输数据了!
常见面试题:
1.为什么需要三次握手,两次不可以吗?或者四次、五次可以吗?
特殊情况,如果是两次握手,假设服务器给客户端在第二次握手时发送数据,数据从服务器发出,服务器认为连接已经建立,但在发送数据的过程中数据丢失,客户端认为连接没有建立,会进行重传。假设每次发送的数据一直在丢失,客户端一直SYN,服务器就会产生多个无效连接,占用资源,这个时候服务器可能会挂掉。这个现象就是我们听过的“SYN的洪水攻击”。
总结:第三次握手是为了防止:如果客户端迟迟没有收到服务器返回确认报文,这时会放弃连接,重新启动一条连接请求,但问题是:服务器不知道客户端没有收到,所以他会收到多连接,浪费连接开销。
---------------------------------------------------------------------------------------------------------
四次挥手过程 (客户端->服务器、服务器->客户端 形成4次挥手)
step1:第一次挥手
首先,客户端停止数据发送,并发出一个FIN用来关闭客户端到服务器的数据传送,客⼾端进⼊FIN_WAIT_1状态。然后等待服务器的确认。其中终止标志位FIN=1,序列号seq=u。
step2:第二次挥手
服务器收到这个FIN,它发送一个ACK给客户端,确认ack为收到的序号加1,服务器进⼊CLOSE_WAIT状态。
step3:第三次挥手
而后,当服务器没有数据要发送时,关闭服务器到客户端的连接,发送一个FIN给客户端,此时服务器进⼊LAST_ACK状态。
step4:第四次挥手
客户端收到FIN后,并发回一个ACK报文确认,并将确认序号seq为收到序号加1,此时客⼾端进⼊TIME_WAIT状态,等待2MSL(MSL:报⽂段最⼤⽣存时间),关闭连接。
首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
TCP是全双⼯通信,每个⽅向都必须单独释放连接!这⼀原则是当⼀⽅完成数据发送任务后,发送⼀个FIN来终⽌这⼀⽅向的连接,收到⼀个FIN仅意味着这⼀⽅向上没有数据流动了,即不会再收到数据了(“半关闭状态”)。但在这个TCP连接上仍然能够发送数据,直到这⼀⽅向也发送了FIN。(主动发FIN就是主动方)
- 为什么需要2MSL时间?
首先,MSL即是任何报文的最大生存时间,超过这个时间报文将被丢弃。
等待2MSL时间主要目的是:防止最后一个ACK包对方没有收到,(收不到确认,就无法按步骤进入CLOSED状态,无法重传),那么对方在超时后将重发第三次握手的FIN包,重新关闭。在TIME_WAIT状态时两端的端口不能使用。
3.为什么是四次挥手,而不是三次或是五次、六次?
双方关闭连接要经过双方都同意。所以,首先是客户端给服务器发送FIN,要求关闭连接,服务器收到后会发送一个ACK进行确认。服务器然后再发送一个FIN,客户端发送ACK确认,并进入TIME_WAIT状态。等待2MSL后自动关闭。
--------------------------------------------------------------------------------------------------------------
https://www.cnblogs.com/hanfanfan/p/9579771.html
https://www.cnblogs.com/williamjie/p/9390164.html