IP TCP UDP HTTP
IP协议对应于网络层,TCP、UDP协议对应于传输层,而HTTP协议对应于应用层。
IP协议是网络层协议,是一种不可靠的、无链接的传送机制称为Internet协议,解决的是主机之间如何通讯的问题
TCP、UDP是传输层协议,解决的是数据如何传输的问题
HTTP是应用层协议,解决的是数据如何包装的问题
Socket自己并非协议,而是一个针对TCP或者IP的调用接口(API),解决的是区分不一样的应用程序进程间的网络通讯和链接,从而实现数据传输并发服务的问题
传输层的TCP是基于网络层的IP协议的,而应用层的HTTP协议又是基于传输层的TCP协议的。而Socket自己不算是协议,就像上面所说,它只是提供了一个针对TCP协议或者IP协议的编程接口。
socket链接、TCP链接、UDP链接、HTTP链接?
建立Socket链接时,能够指定使用的传输层协议,Socket能够支持不一样的传输层协议(TCP或UDP),当使用TCP/UDP协议进行链接时,该Socket链接就是一个TCP链接/UDP链接。
一般状况下 Socket 链接就是TCP链接,所以 Socket 链接一旦创建,通讯双方便可开始相互发送数据内容,直到双方链接断开。但在实际网络应用中,客户端到服务器之间的通讯每每须要穿越多个中间节点,例如路由器、网关、防火墙等,大部分防火墙默认会关闭长时间处于非活跃状态的链接而致使 Socket 链接断连,所以须要经过轮流询问告诉网络,该链接处于活跃状态。
而HTTP链接使用的是“请求—响应”的方式,不只在请求时须要先创建链接,并且须要客户端向服务器发出请求后,服务器端才能回复数据。
不少状况下,须要服务器端主动向客户端推送数据,保持客户端与服务器数据的实时与同步,此时若双方创建的是Socket链接,服务器就能够直接将数据传送给客户端;若双方创建的是HTTP链接,则服务器须要等到客户端发送一次请求后才能将数据传回给客户端,所以,客户端定时向服务器端发送链接请求,不只能够保持在线,同时也是在“询问”服务器是否有新的数据,若是有就将数据传给客户端。
TCP和UDP的区别?
一、TCP是面向链接,可靠、稳定的,缺点:慢,效率低,占用系统资源高,容易被攻击。虽说网络的不安全不稳定特性决定了多少次握手都不能保证链接的可靠性,但TCP的三次握手在最低限度上(实际上也很大程度上)保证了链接的可靠性;
而UDP非面向链接,快,比TCP稍安全,缺点:不可靠、不稳定。UDP传送数据前并不与对方创建链接,对接收到的数据也不发送确认信号,发送端不知道数据是否会正确接收,固然也不用重发,因此说UDP是无链接的、不可靠的一种数据传输协议。
二、也正因为1所说的特色,使得UDP的开销更小,数据传输速率更高,由于没必要进行收发数据的确认,因此UDP的实时性更好。
知道了TCP和UDP的区别,就不难理解为什么采用TCP传输协议的MSN比采用UDP的QQ传输文件慢了,但并不能说QQ的通讯是不安全的,
由于程序员能够手动对UDP的数据收发进行验证,好比发送方对每一个数据包进行编号而后由接收方进行验证啊什么的,
即便是这样,UDP由于在底层协议的封装上没有采用相似TCP的“三次握手”,而实现了TCP没法达到的传输效率。
三、TCP应用场景 如:浏览器使用HTTP,QQ文件传输等
四、UDP应用场景 如:QQ语音、QQ视频等
五、转发
TCP三次握手和四次挥手?
tcp三次握手
所谓三次握手(Three-way Handshake),是指创建一个TCP链接时,须要客户端和服务器总共发送3个包。
三次握手的目的是链接服务器指定端口,创建TCP链接,并同步链接双方的序列号和确认号并交换 TCP 窗口大小信息.在 Socket 编程中,客户端执行connect()时,将触发三次握手。
首先了解一下几个标志,SYN(synchronous),同步标志,ACK (Acknowledgement),即确认标志,seq应该是Sequence Number,序列号的意思,另外还有四次握手的fin,应该是final,表示结束标志。
第一次握手:客户端发送一个TCP的SYN标志位置1的包指明客户打算链接的服务器的端口,以及初始序号X,保存在包头的序列号(Sequence Number)字段里。
第二次握手:服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位均为1同时,将确认序号(Acknowledgement Number)设置为客户的序列号加1以,即X+1。
第三次握手:客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1。而且把服务器发来ACK的序号字段+1,放在肯定字段中发送给对方.而且在数据段放写序列号的+1。
tcp四次挥手
TCP链接的拆除须要发送四个包,所以称为四次挥手(four-way handshake)。客户端或服务器都可主动发起挥手动做,在socket编程中,任何一方执行close()操做便可产生挥手操做。
其实有个问题,为何链接的时候是三次握手,关闭的时候倒是四次挥手?
由于当Server端收到Client端的SYN链接请求报文后,能够直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。可是关闭链接时,当Server端收到FIN报文时,极可能并不会当即关闭SOCKET,因此只能先回复一个ACK报文,告诉Client端,” 你发的FIN报文我收到了”。只有等到我Server端全部的报文都发送完了,我才能发送FIN报文,所以不能一块儿发送。故须要四步握手。
tcp socket和udp socket的具体实现
经常使用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向链接的 Socket,针对于面向链接的TCP服务应用;数据报式 Socket 是一种非面向链接的 Socket ,对应于非面向链接的UDP服务应用。