建立socket连接

image.png
命令追踪:
image.png
42632是随机的端口号
nc只是建立连接
image.png

image.png
两个换行符之后是响应体(body,html)

断开连接
image.png

传输层是传输控制层

应用层想要建立连接
但是实际上可以建立连接的是传输控制层

TCP、UDP

什么是TCP 协议

面向连接的

三次握手

但是三次握手不代表能够建立连接

image.png
在这之后双方要为连接开辟资源
image.png
所有的连接都有Recv-Q和Send-Q
内核中都有资源的创建,而且这两个资源只给socket连接用

image.png

socket

  1. 什么是socket?

套接字
一个四元组:
clinet IP + clinet port《====》server IP + server Port
为了唯一确认每一个socket对应的关系

  1. 为什么不同的网页请求回复数据没有穿插错?
  2. port

65535

四次挥手

分手为什么是四次?(http 1.0,不带keep alive)
释放资源的过程
image.png
资源是为对方服务的,客户端和服务端都要发fin数据包,并且收到ack,才是销毁资源,撤销连接的时机

curl 经历了三次握手四次挥手的全部过程
tcpdump -nn -i eth0 port 80
image.png

tcpdump -nn -X -i eth0 port 80
三次握手
image.png
四次挥手
image.png

可靠的传输协议

拥塞控制

慢加载
啥来着

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 应用系统。

据说现在都去搞 C10M 了,你们怕不怕?

select/poll模型 Epoll模型

网络层

  1. 为什么要有netmask

netmask是计算主机在局域网中的具体位置

  1. 为什么要有网关/gateway

image.png
image.png
baidu.com的ip地址,与路由表中的GenMask按位与,(最长前缀匹配)得到该往哪个地址发

链路层

刚才我们选择了 172.29.207.253这个网关往外发送数据
那数据包里要放什么?
baidu的ip地址还是172.29.207.253这个网关的ip
如果放172.29.207.253这个网关的地址,网关识别,发给我的,那不会继续往下转发
如果放baidu的ip地址,那么这个路要怎么走?

这个时候就需要把数据包转发到下一层

image.png

image.png

拥塞控制

流水线传输

三次+四次超详细

问题

  1. 为什么是三次握手,不是两次

连接是双向的,两次握手只是保证了在客户端看来是连接的,但是在服务端看来,并没有收到客户端的ack,就无法确认自己的数据是否能发送到客户端。

内存与IO,磁盘IO,网络IO