远程通讯协议-tcp/ip及nio的学习笔记

tcp 7层

  • 应用层
  • 表示层
  • 会话层
  • 传输层
  • 网络层
  • 数据链路层
  • 物理层

4层网络模型:

其中应用层、表示层、会话层表示应用层,数据链路层、物理层表示网络接口层

ARP协议

复杂的程序都需要分层,软件开发设计必须要做的

tcp负载均衡

二层负载 -> mac地址,vip(虚拟ip) 多个机器IP相同但是mac地址不同

三层负载 ->ip 对外提供虚拟ip,集群中不同机器采用不用的ip,IP请求转发

四层负载 -> 传输层负载,包含ip和端口,修改目标ip和端口地址

七层负载 -> 应用层负载,请求的url,http请求的报文,如http://a/a.html,主机名。

tcp和udp区别

TCP/IP:可靠

  1. 建立连接机制
  2. 三次握手建立连接
    1. client发送请求连接的数据包
    2. server返回可以进行连接的数据包
    3. client发送确认请求连接的数据包
    4. client/server可以进行数据传输了
  3. SYNC攻击 -> 客户端伪造大量ip和mac地址发送消息给服务器,占用服务器大量资源
  4. 连接的关闭,四次挥手协议
    1. client发送请求关闭连接的数据包
    2. server返回确认收到请求关闭的数据包-此时server可能还处于数据操作的状况
    3. server数据已经处理完毕,并返回可以关闭的数据包
    4. client返回最终请求关闭数据包-此时server接收到数据包以后将处于关闭状态,而client可能还处于数据为未接受完的状态,等待2个固定的时间点后进入关闭状态
  5. TCP是一种全双工的协议
  6. 长连接,正常连接是超时关闭,但是长连接可以发送心跳包维持连接

UDP/IP:不可靠

在应用中如何去构建一个传输的实例

socket -> 套接字

socket io

file io

通讯过程中的阻塞

accept阻塞(连接阻塞)

流操作的阻塞(read/write)

滑动窗口的协议

流量控制

BIO模型

​ blocker io 阻塞

优化方案:

可以解决socket io阻塞,但是还是存在file io阻塞问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ServerSocket server = new ServerSocket(8080);
while(true) {
Socket socket = server.accpet();
new Thread(new SocketThread(socket)).start;
}

public class SocketThread implements Runnable{
Socket socket;
public SocketThread(Socket socket) {
this.socket = socket;
}
public void run() {
// 对socket进行操作
}
}

NIO

非阻塞

​ new io / non blocker io

多路复用机制

linux fd:linux系统中一切皆可看成是文件,文件描述符是内核为了高效管理已被打开的文件所创建的索引

serverSocket 向请求内核

先监听socket/fd,再如果发现socket/fd已就绪,就发送数据已经准备好的通知(即可以像该文件进行读写),然后serverSocket再来发送read/write请求

linux提供的io复用机制

select/poll:轮询查询socket/fd是否已经就绪

epoll:事件机制,理解为注册监听机制,如果发现socket/fd就绪直接返回就绪通知,可以进行读写

服务端的机器怎么去标记一个个的连接

四元组:source_ip/source_port/target_ip/target_port

因为目标机器的ip和端口固定,所以最大连接数取决于客户端的数量

source_ip : 2^32

source_port:2^16 因为0不能作为端口,所以是65535个

  1. 内存大小
  2. 文件句柄的限制
  3. ulimit -n 默认是1024
  4. 带宽的资源