建立socket连接
命令追踪:
42632是随机的端口号
nc只是建立连接
两个换行符之后是响应体(body,html)
断开连接
传输层是传输控制层
TCP、UDP
什么是TCP 协议
面向连接的
三次握手
但是三次握手不代表能够建立连接
在这之后双方要为连接开辟资源
所有的连接都有Recv-Q和Send-Q
内核中都有资源的创建,而且这两个资源只给socket连接用
socket
- 什么是socket?
套接字
一个四元组:
clinet IP + clinet port《====》server IP + server Port
为了唯一确认每一个socket对应的关系
- 为什么不同的网页请求回复数据没有穿插错?
- port
四次挥手
分手为什么是四次?(http 1.0,不带keep alive)
释放资源的过程
资源是为对方服务的,客户端和服务端都要发fin数据包,并且收到ack,才是销毁资源,撤销连接的时机
curl 经历了三次握手四次挥手的全部过程
tcpdump -nn -i eth0 port 80
tcpdump -nn -X -i eth0 port 80
三次握手
四次挥手
可靠的传输协议
拥塞控制
慢加载
啥来着
C10k问题
The C10K problem
程序员怎么会不知道 C10K 问题呢?
C10K 就是 Client 10000 问题
底层的相关技术包括 epoll、kqueue、libevent 等,应用层面的解决方案包括 OpenResty、Golang、Node.js 等,比如 OpenResty 的介绍中是这么说的:
OpenResty 通过汇聚各种设计精良的 Nginx 模块,从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 C10K 乃至 C1000K 以上单机并发连接的高性能 Web 应用系统。
select/poll模型 Epoll模型
网络层
- 为什么要有netmask
netmask是计算主机在局域网中的具体位置
- 为什么要有网关/gateway
baidu.com的ip地址,与路由表中的GenMask按位与,(最长前缀匹配)得到该往哪个地址发
链路层
刚才我们选择了 172.29.207.253这个网关往外发送数据
那数据包里要放什么?
baidu的ip地址还是172.29.207.253这个网关的ip
如果放172.29.207.253这个网关的地址,网关识别,发给我的,那不会继续往下转发
如果放baidu的ip地址,那么这个路要怎么走?
这个时候就需要把数据包转发到下一层
拥塞控制
流水线传输
三次+四次超详细
问题
- 为什么是三次握手,不是两次
连接是双向的,两次握手只是保证了在客户端看来是连接的,但是在服务端看来,并没有收到客户端的ack,就无法确认自己的数据是否能发送到客户端。
内存与IO,磁盘IO,网络IO