上篇《网络七层协议》中我们简单介绍了TCP/IP协议的七大层,在七大层中,下层主要是为上层服务。在我们移动开发学习中,接触运用比较多的是其中的传输层(TCP/UDP)和应用层,本片将详细介绍这两个层中我们大概需要掌握的知识点。
一.传输层和应用层的联系
顾名思义,传输层的作用就是传输数据,而应用层是对于数据的识别和处理。因此如果想要数据传输有
意义,则需要有应用层对其识别解读处理,此时需要使用到应用层协议,比如HTTP、FTP、TELNET等
二.传输层(TCP/UDP)
传输层提供了两种到达目标网络的方式:
- 传输控制协议(TCP):提供了完善的错误控制和流量控制,能够确保数据正常传输,是一个面向连接的协议。
- 用户数据报协议(UDP):只提供了基本的错误检测,是一个无连接的协议。
我们知道了在网络传输过程中。可以采用TCP或者UDP这两种传输协议去达成目的,那么这两种协议之间有什么却别呢?在开发过程中,又是什么样的场景对应选择何种传输协议呢?
在阐述TCP和UDP协议的区别之前,有必要了解一下TCP链接的三次握手(UDP没有):
SYN(同步标志)是TCP/IP建立连接时使用的握手信号,TCP连接的第一个包,非常小的数据包
ACK(确认标志)大多数情况下该标志位是置位的。TCP报头内的确认编号栏内包含的确认编号(w+1,
Figure-1)为下一个预期的序列编号,同时提示远端系统已经成功接收所有数据。
1.第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认
2.第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
3.第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。客户端与服务器开始传输数据
TCP与UDP各自特点握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“四次握手”(过程就不细写了,就是服务器和客户端交互,最终确定断开)
TCP与UDP的区别:
-
TCP提供可靠的数据连接,UDP提供不可靠的数据连接:因为TCP是面向链接的,虽然说网络的不安全不稳定特性决定了多少次握手都不能保证连接的可靠性,但TCP的三次握手在最低限度上(实际上也很大程度上保证了)保证了连接的可靠性,并且TCP会验证数据包的顺序,丢失还会重新发送;而UDP不是面向连接的,UDP传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,发送端不知道数据是否会正确接收,当然也不用重发,所以说UDP是无连接的、不可靠的一种数据传输协议
-
正因为上面所描述的,UDP少了这些校验,不必进行收发数据的确认,使得UDP的开销更小,数据传输速率更高,因此在及时性上的表现更好一些。所有常见的音视频聊天基本都使用UDP协议,及时丢了一两个包也只是会导致画面卡顿一下或声音模糊一下,同时保证了数据的高效传输。
-
TCP是面向连接,一对一的通信;而UDP是广播方式,一对多的通信
三.Socket
我们平时说的最多的socket是什么呢,实际上socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。实际上,Socket跟TCP/IP协议没有必然的联系。Socket编程接口在设计的时候,就希望也能适应其他的网络协议。所以说,Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而形成了我们知道的一些最基本的函数接口,比如create、listen、connect、accept、send、read和write等等。
实际上,传输层的TCP是基于网络层的IP协议的,而应用层的HTTP协议又是基于传输层的TCP协议的,而Socket本身不算是协议,就像上面所说,它只是提供了一个针对TCP或者UDP编程的接口。
网友评论