写点什么

架构师训练营第八周笔记

用户头像
Melo
关注
发布于: 2020 年 07 月 23 日

计算机网络

在上面的典型例子中,一次Web请求,需要经过很多次网络通信。





只要是在网络上跑的包,都是完整的。可以有下层没上层,绝对不可能有上层没下层。



Mac地址的重要性

有了mac地址为什么还要有ip地址。举个例子,身份证号是你的唯一标识,不会重复,一落户就有(网卡一出厂就有mac)。现在我要和你通信(写信给你),地址用你的姓名+身份证,信能送到你手上吗?明显不能!身份证号前六位能定位你出生的县。mac地址前几位也可以定位生产厂家。但是你出生后会离开这个县(哪怕在这个县,也不能具体找到你)。所以一般写个人信息就要有出生地和现居地址了。



应用层HTTP协议

自己定义协议时,要在协议里定义要在包头记录内容的长度



TCP的三次握手

TCP的四次挥手



非阻塞网络I/O

Socket编程接口

下图是基于 TCP 协议的 Socket 程序函数调用过程。

  • 多线程服务器(一个连接一个线程)E.g. 有限的capacity, 每次连接需要创建新的线程。Tomcat 100级别的连接

  • 线程池服务器

都是阻塞I/O:accept那里阻塞。(TODO:拷贝区)



非阻塞I/O:I/O操作立即返回,发起线程不会阻塞等待。

Java NIO (New I/O): 还是有阻塞的。

Selector => 检查所有的Socket。

Buffer => 应用线程直接和buffer操作,所以应用程序看起来是无阻塞的。

SelectionKey

SelectableChannel => 对应一个Socket

一个线程可以处理很多连接。

系统I/O复用方式:select, poll, epoll

select, poll管理下的read过程:

任何一个Socket有事件发送,都会唤醒线程。线程去遍历所有的Socket



epoll管理下的read过程:

任何一个Socket有事件发送,事件加入eventpoll里的事件列表,都会接着唤醒线程。线程直接去查询事件列表。



无活动连接时,Selector.select()还是会阻塞。

NIO更深入的文章:https://time.geekbang.org/column/article/8369

Epoll非常精彩的底层介绍:https://time.geekbang.org/column/article/9293



用户头像

Melo

关注

还未添加个人签名 2019.09.17 加入

还未添加个人简介

评论 (1 条评论)

发布
用户头像
作业请加“极客大学架构师训练营”标签,便于分类
2020 年 07 月 27 日 17:11
回复
没有更多了
架构师训练营第八周笔记