网络
网络
OSI七层模型
应用层
表示层
会话层
传输层
网络层
数据链路层
物理层
网络通信
IP地址
端口
协议
进程通信
消息传递(管道、消息队列)
共享内存(semophore信号量)
信号:通知接收进程有某事已经发生
套接字,远程调用(RPC)
TCP
面向连接
三次握手
C和S处于关闭状态,C主动向S发送连接请求,生成序列号seq=x,C处于SYN-SEND(同步已发送)状态
S同意建立连接,向C发送确认报文,并生成序列号seq=y,ack=x+1,S处于同步收到状态
C收到确认报文后,检查ack=x+1是否正确,再向S发送确认报文,seq=x+1,ack=y+1,C处于连接成功状态
不能两次握手原因
防止旧的重复连接引起连接混乱
C向S发送请求,由于网络原因,请求阻塞,S一直未收到,C又向S发送连接请求,建立连接后传输完数据连接关闭,S收到第一次阻塞连接请求,以为是C发送的新的请求,S发送确认给C,C没有发送新的请求,所以会忽略,而S一直处于建立连接状态,会给S造成浪费
不能四次握手原因
三次握手已经可以确认是同一连接
四次挥手
C主动向S发送FIN请求,seq=u,C进入FIN-WAIT-1状态
S收到后,发送确认码ACK给C,seq=v,ack=u+1,S处于CLOSE-WAIT状态,C处于FIN-WAIT-2状态,继续将数据发送给C
数据发送完成后,S发送FIN给C,seq=w,ack=u+1,S处于LAST-ACK状态
S收到FIN请求,发送ACK应答,seq=u+1,ack=w+1,C处于TIME-WAIT状态
不能三次挥手原因
TCP半关闭特性,C关闭后S还能向C发送数据
传输可靠(数据无丢失、无重复、无错误、无失序)
一对一通信
速度慢
对数据准确度要求高,实时性不强,适用于文件传输
面向字节流,无限制,没有消息保护边界,需要粘包拆包。
客户端给服务端发送两个数据包,服务端可能只接收到一个,写入数据大于套接字缓冲区,会发生拆包;写入数据小于套接字缓冲区,需要粘包。
头部加数据包长度
数据包封装为固定长度,不足补0
特殊字符区分
UDP
无连接,发送即结束,没有重传机制,只需发送,不管对方是否接收
不可靠传输
支持一对一,一对多,多对一交互通信
实时性要求高,适用于实时应用,如语音、视频、直播等
面向报文,数据打包传输,有消息保护边界,头部有传输报文长度,每个消息都是独立的,不需要粘包拆包
Socket
套接字,计算机进行通信的一种方式
Netty
异步事件驱动的网络应用程序框架,ElasticSearch和Dubbo使用的Netty
采用异步通信NIO的方式
一个IO线程可以处理多个C的连接和读写
零拷贝
使用堆外内存直接进行socket读写,不需要进行字节缓冲区的二次拷贝
往服务器发送网络请求时,要经过四次拷贝,操作磁盘和网络的一般不允许用户进程直接访问,需要内核来处理
高性能序列化框架
对protobuff支持,二进制流传输