socket、tcp、udp、http 的认识及区别

原文:https://www.cnblogs.com/chengzhengfu/p/4584510.html

一、概念

1、TCP/IP是个协议组,可分为三个层次:网络层、传输层和应用层。

网络层协议:IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。
传输层协议:TCP协议与UDP协议。
应用层协议:FTP、HTTP、TELNET、SMTP、DNS等协议。

2、HTTP协议是建立在请求/响应模型上的。

HTTP本身就是一个协议,是从Web服务器传输超文本到本地浏览器的传送协议。

首先由客户建立一条与服务器的TCP链接,并发送一个请求到服务器;
请求中包含请求方法、URI、协议版本以及相关的MIME样式的消息;
服务器响应一个状态行,包含消息的协议版本、一个成功和失败码以及相关的MIME式样的消息。

HTTP/1.0为每一次HTTP的请求/响应建立一条新的TCP链接。
因此一个包含HTML内容和图片的页面将需要建立多次的短期的TCP链接。一次TCP链接的建立将需要3次握手。另外,为了获得适当的传输速度,则需要TCP花费额外的回路链接时间(RTT)。每一次链接的建立需要这种经常性的开销,而其并不带有实际有用的数据,只是保证链接的可靠性。

由此HTTP/1.1提出了可持续链接的实现方法。HTTP/1.1将只建立一次TCP的链接而重复地使用它传输一系列的请求/响应消息,因此减少了链接建立的次数和经常性的链接开销。

虽然HTTP本身是一个协议,但其最终还是基于TCP的。不过,目前,有人正在研究基于TCP+UDP混合的HTTP协议。

3、SOCKET

Socket是什么呢?
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API)。通过Socket,我们才能使用TCP/IP协议。

实际上,Socket跟TCP/IP协议没有必然的联系。Socket编程接口在设计的时候,就希望也能适应其他的网络协议。

所以说,Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而形成了我们知道的一些最基本的函数接口,比如create、 listen、connect、accept、send、read和write等等。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,

4、TCP与UDP

TCP连接的三次握手:

  1. client发送syn包(syn=j)到server,并进入SYN_SEND状态,等待server确认;
  2. server收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
  3. client收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

socket、tcp、udp、http 的认识及区别

握手过程中传送的包里不包含数据,
三次握手完毕后,客户端与服务器才正式开始传送数据

TCP的四次挥手:

  1. client发出连接释放报文段(FIN=1,序号seq=u),并停止再发送数据,主动关闭TCP连接,进入FIN-WAIT-1(终止等待1)状态,等待server的确认。
  2. server收到连接释放报文段后即发出确认报文段,(ACK=1,确认号ack=u+1,序号seq=v),进入CLOSE-WAIT(关闭等待)状态,此时的TCP处于半关闭状态,client到server的连接释放。
  3. client收到server的确认后,进入FIN-WAIT-2(终止等待2)状态,等待server发出的连接释放报文段。
  4. server没有要向client发出的数据,server发出连接释放报文段(FIN=1,ACK=1,序号seq=w,确认号ack=u+1),server进入LAST-ACK(最后确认)状态,等待client的确认。
  5. client收到server的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),client进入TIME-WAIT(时间等待)状态。此时TCP未释放掉, Client端等待了2MS后依然没有收到回复,则证明Server端已正常关闭,client才进入CLOSED状态。

socket、tcp、udp、http 的认识及区别

TCP和UDP是FTP、HTTP和SMTP之类使用的传输层协议。

虽然TCP和UDP都是用来传输其他协议的,它们却有一个显著的不同:TCP提供有保证的数据传输,而UDP不提供。

TCP是面向链接的,虽然说网络的不安全不稳定特性决定了多少次握手都不能保证连接的可靠性,但TCP的三次握手在最低限度上(实际上也很大程度上保证了)保证了连接的可靠性;

而UDP不是面向连接的,UDP传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,发送端不知道数据是否会正确接收,当然也不用重发,所以说UDP是无连接的、不可靠的一种数据传输协议。也正由于上面的特点,使得UDP的开销更小数据传输速率更高,因为不必进行收发数据的确认,所以UDP的实时性更好。

所以采用TCP传输协议的MSN比采用UDP的QQ传输文件慢,
但并不能说QQ的通信是不安全的,因为程序员可以手动对UDP的数据收发进行验证,
比如发送方对每个数据包进行编号然后由接收方进行验证啊什么的,
即使是这样,UDP因为在底层协议的封装上没有采用类似 TCP的“三次握手”而实现了TCP所无法达到的传输效率。

二、关系与区别

socket、tcp、udp、http 的认识及区别

网络由下往上分为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。

IP 协议对应于网络层,用来连接网络。
TCP、UDP协议对应于传输层,是一种允许我们安全传输数据的机制。

TPC/IP协议是传输控制协议/网际协议,是个协议组,指的是一系列协议,主要解决数据如何在网络中传输。

HTTP协议(超文本传输协议)对应于应用层,主要解决如何包装数据。

是利用TCP在两台电脑(通常是Web服务器和客户端)之间传输信息的协议

SOCKET:TCP/IP网络的API,是对TCP/IP协议的封装和应用。

Socket本身不算是协议,就像上面所说,它只是提供了一个针对TCP或者UDP编程的接口。

实际上,TCP和UDP是基于网络层的IP协议;使用IP协议从一个网络传送数据包到另一个网络。而应用层的HTTP协议又是基于传输层的TCP协议的。

把IP想像成一种高速公路,它允许其它协议在上面行驶并找到到其它电脑的出口。
TCP和UDP是高速公路上的“卡车”,它们携带的货物就是像HTTP,文件传输协议FTP这样的协议等。