OSI七层模型
OSI(Open System Interconnection),由底层到高层分别为,物理层、数据链路层,网络层,传输层、会话层,表示层、应用层
物理层:负责将比特流与电子信号转换
数据链路层:定义了通过通信介质相互连接的设备之间,数据传输的规范。有两个重要的概念:MAC 地址和分组交换,数据链路层的意义在于,如果没有数据链路层,数据只能以流的形式存在与通信介质中,不知道该发送往哪里,过长的数据流可能无法在通信介质中传输。
网络层:主要作用是实现终端节点间的通信。IP协议是网络层的一个重要协议,网络层中还有ARP(获取MAC地址)和ICMP协议(数据发送异常通知),数据链路层的作用在于实现同一种数据链路下的包传递,而网络层则可以实现跨越不同数据链路的包传递。比如主机A通过Wi-Fi连接到路由器B,路由器B通过以太网连接到路由器C,而路由器C又通过Wi-Fi与主机D保持连接。这时主机A向D发送的数据包就依赖于网络层进行传输。
传输层:传输层的主要作用是实现应用程序之间的通信。网络层主要是保证不同数据链路下数据的可达性,至于如何传输数据则是由传输层负责,TCP 协议和 UDP 协议。
会话层:会话的建立和结束
表示层:数据表示、压缩和加密presentation,表示层相当于一个东西的表示,表示的一些协议,比如图片、声音和视频MPEG。
应用层:直接为用户的应用程序提供服务,应用接口,TELNET、FTP、HTTP
TCP/UDP
两个协议是进程间通信,也就是说应用间的通信,
在传输层,使用端口号来识别同一台计算机中进行通信的不同应用程序,TCP/IP或UDP/IP通信中通常使用5个信息来识别一个通信:“源IP地址”、“目标IP地址”、“源端口号”、“目标端口号”以及“协议号”
TCP协议:面向连接,可靠的流协议。连接是指两个应用程序为了传递信息而专有的虚拟的通信线路,也称为虚拟电路。TCP充分实现了数据传输时各种控制功能,可以进行丢包的重发控制,还可以对次序乱掉的分包进行顺序控制。而这些在UDP中都没有。此外,TCP作为一种面向有连接的协议,只有在确认通信对端存在时才会发送数据,从而可以控制通信流量的浪费。
TCP通过检验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输。
效率要求相对低,但对准确性要求相对高的场景。因为传输中需要对数据确认、重发、排序等操作,相比之下效率没有UDP高。举几个例子:文件传输(准确高要求高、但是速度可以相对慢)、接受邮件、远程登录。
UDP协议:面向无连接,不具有可靠性的数据报协议。只确保发送消息,其他处理都由上层应用来完成。
即使是出现网络拥堵的情况下,UDP也无法进行流量控制等避免网络拥塞的行为。此外,传输途中如果出现了丢包,UDP也不负责重发。甚至当出现包的到达顺序乱掉时也没有纠正的功能。如果需要这些细节控制,那么不得不交给由采用UDP的应用程序去处理。换句话说,UDP将部分控制转移到应用程序去处理,自己却只提供作为传输层协议的最基本功能。UDP有点类似于用户说什么听什么的机制,但是需要用户充分考虑好上层协议类型并制作相应的应用程序。
效率要求相对高,对准确性要求相对低的场景。举几个例子:QQ聊天、在线视频、网络语音电话(即时通讯,速度要求高,但是出现偶尔断续不是太大问题,并且此处完全不可以使用重发机制)、广播通信(广播、多播)。
TCP与UDP区别总结:
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的,没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
UDP(User Datagram Protocol)用户数据报协议
UDP不提供复杂的控制机制,利用IP提供面向无连接的通信服务。并且它是将应用程序发来的数据在收到的那一刻,立即按照原样发送到网络上的一种机制。
无需建立连接(减少延迟)
实现简单:无需维护连接状态
头部开销小
没有拥塞控制:应用可以更好的控制发送时间和发送速率
TCP(Transmission Control Protocol)传输控制协议
TCP通过校验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输。数据通信之前必须先做好连接工作,在TCP中连接的建立需要三次握手,同时在通信结束时会进行断开连接的处理(四次挥手)。一个连接的建立与断开,正常过程至少需要来回送7个包才能完成。
TCP的三次握手:是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。
1、客户端向服务器发送一个SYN(synchronous),客户端进入SYN_SEND状态
2、服务器收到SYN包后,服务器进入SYN_RECV状态,发出SYN+ACK(Acknowledgement)
3、客户端收到SYN+ACK后发出ACK确认给服务器,客户端进入ESTABLISH状态。
4、服务器收到ACK后,服务器进入ESTABLISH状态。
连接建立,开始传输数据。
TCP的四次挥手:TCP的连接的拆除需要发送四个包
TCP连接是全双工的,所以它允许两个方向的数据传输被独立关闭,通信的一端可以发送结束报文段给对方,告诉它本端已经完成了数据的发送,但允许继续接收来自对方的数据,直到对方也发送结束报文段以关闭连接。
1、客户端发送发送一个FIN,等待服务器返回ACK和FIN,客户端进入FIN_WAIT_1状态;
2、服务器接收FIN,发出一个收到FIN的ACK确认,服务器进入Close Wait状态;
3、客户端收到ACK,继续等待服务器的FIN,客户端进入FIN_WAIT_2状态;
4、服务器发送FIN,服务器等待客户端收到FIN的ACK,服务器进入LAST_ACK状态;
5、客户端收到FIN,发出ACK,客户端进入TIME_WAIT状态(2MSL等待状态);等到2MSL后,客户端进入CLOSE状态
6、服务器接收ACK,服务器进入CLOSE状态;
连接关闭。
TCP窗口:TCP中,发送端的数据包到达接收端时,接收端会返回一个带序号的ACK确认,当数据包丢失或者ACK丢失或者延误时,发送端就会重新发送数据包。当ACK延误时,会出现重复发送的状况。引入序号机制则可以避免重复发送实现可靠传输。如果每次发送都要等确认的话,这样包的往返时间,网络吞吐量就会差。所以引入窗口机制。窗口控制,允许收到ACK之前,多次发送数据组。
TCP流量控制:就是让发送方的发送速率不要太快,要让接收方来得及接收。原理这就是运用TCP报文段中的窗口大小字段来控制,发送方的发送窗口不可以大于接收方发回的窗口大小。
TCP拥塞控制:拥塞窗口cwnd慢开始,收到ACK时,拥塞窗口由1开始指数级增长,增长到慢开始门限值ssthresh时,执行拥塞避免算法,拥塞窗口按线性规律增长。
TCP/IP
TCP/IP协议族分为四层:应用层,传输层,网络层,数据链路层。这样分层可以将功能分割开来,如果需要改动,只需要改动对应层级的协议而不需要替换整体,定义好对应的接口后,每个层次内部就可以自由设计了。
应用层:应用层决定了向用户提供应用服务时的通信活动,FTP,DNS,HTTP协议就是在这一层
传输层:提供处于网络中的两台计算机之间的通信,TCP和UDP
网络层:网络层用来处理网络上的数据包,数据包是网络传输的最小单位,网络层规定了通过怎么样的路径到达对方计算机,并把数据包传给对方。网络层的作用就是在众多选项中选择一个传输路线。IP协议。IP协议的作用就是把数据包传递给对方,而要准确地把数据包发送给对方,要满足条件,最重要的条件就是IP地址和MAC地址,IP地址指明了节点被分配到的位置,可换,MAC地址指网卡所属的地址,固定。
数据链路层:用来处理连接网络的硬件部分,包括控制操作系统,硬件的设备驱动,NIC(网卡),光钎等硬件可见部分。
Socket
Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。
在socket编程中,客户端执行connect()时,将触发三次握手。在socket编程中,任何一方执行close()操作即可产生挥手操作。
Socket连接与HTTP连接的不同
通常情况下Socket连接就是TCP连接,因此Socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。但在实际应用中,客户端到服务器之间的通信防火墙默认会关闭长时间处于非活跃状态的连接而导致 Socket 连接断连,因此需要通过轮询告诉网络,该连接处于活跃状态。
而HTTP连接使用的是“请求—响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。
长连接和短连接
长连接:在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持。连接→数据传输→保持连接(心跳)→数据传输→保持连接(心跳)→……→关闭连接;
长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况。
每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,
所以每个操作完后都不断开,下次次处理时直接发送数据包就OK了,不用建立TCP连接。
短连接: 指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接;连接→数据传输→关闭连接;