内核怎么帮程序建立连接的(上)

简介: 内核怎么帮程序建立连接的(上)

承接上文网络通讯原理简介以及演示通讯过程

是内核的传输控制层完成的

image.png


程序先有连接 才会发送数据 所以该过程是阻塞的


传输控制层


该层的协议有UDP、TCP
面向连接的可靠的传输协议

image.png

三次握手让双方都确认自己的输入输出都是通的
双方要为对方在内存中开辟资源
这个资源在每台主机里面 是物理的 为对方提供服务(由谁接收 怎么统计 接收队列长了多少了 ) 这个时候才有了连接
三次握手之后 才允许 程序给传输控制层传输数据

socket

image.png


socket中文是套接字
用一个四元组ip:port+ip:port(客户端ip和端口 + 服务端ip和端口)来表示
在linux系统中用一个文件描述符来代表
一个ip可以创建65535个端口
客户端IPA和服务器IPB可以建立65535个连接

image.png

IPA可以和IPB之间建立65535个连接
IPA也可以和IPC之间建立65535个连接

netstat -natp

image.png

这是一个socket连接表
服务器A可以对服务器B最多能发送65535个连接
但不妨碍对另外一台服务器发送65535个连接
所以有了资源释放的概念即断开连接

四次分手

image.png

四次分手形象描述:
A:我要和你分手
B:哼(听到了)
B:我也想和你分手
A:好啊
如果一方没有发送过来 则另外一方就会进入等待状态

curl www.baidu.com

image.png

curl调用了内核的三次握手建立连接
把请求头发送给了对方
对方一定会有响应
它也读到了响应
curl命令最后结束退出
该请求响应的过程 包含了完整的通信过程 三次握手->中间数据传输->四次分手
抓包就抓curl请求的生命周期

抓包命令:tcpdump -nn -i port 80

-nn 表示 不显示明文和localhost等 而是该显示端口显示端口 该显示ip显示ip
-i 表示 inteface 你要抓的是哪个接口
port 抓数据包里面有80端口号 因为访问百度走的80

查看网卡接口名字:ifconfig

image.png

192.168.150.11是我本地的ip地址
随机申请了一个端口号47449 请求百度服务器61.135.169.125:80发送了一个数据包
想建立握手 这个数据包是传输控制层发送的第一个握手的数据包 长度为0
百度给响应的包也是在传输控制层完成的 长度也是0
给百度回了一个数据包 大小依然是0 
以上是三次握手的过程
接着给百度发送了一个请求头
请求头给返回了一个ack 大小0
百度给返回一个数据包 大小为1460
给百度回了一个ack
百度又给发送了一个数据包 大小1321
把数据切成了2个包
给百度回复ack确认
2个包加起来就是百度主页所有字节
本地给百度发了一个数据包 Fin 断开连接 大小是0 本地内核给百度发送的第一个分手的数据包
百度首先返回一个ack确认的包 大小0
百度又说 其实我也想和你断开连接 大小依然是0
本地再给百度回复 其实我也是这么想的
以上就是三次握手 数据传输 四次分手的过程

数据更详细 tcpdump -nn -X -i port 80

本地给百度发送请求头

image.png

nc www.baidu.com 80

类似于telnet 可以和别人建立远程连接
但是它只完成了tcp socket的三次握手

image.png

两次换行才能把整个头发送出去
抓包可以看到 本地发送了请求头给百度 
百度返回了响应头
然后四次分手

四次分手可以粘成3个包


image.png

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
8月前
|
网络协议 Linux 数据库
Linux TCP作为服务器连接方式:建立稳健高效的服务器通信
在Linux服务器开发中,TCP(Transmission Control Protocol)是一种常用的传输层协议,它为服务器与客户端之间的连接提供可靠的、面向连接的通信方式。本文将深入探讨Linux TCP作为服务器连接方式的工作原理,包括服务器端的建立、连接管理和数据传输,以帮助读者建立稳健高效的服务器通信。
223 0
|
9月前
|
存储 Unix Linux
Linux设备驱动程序(二)——建立和运行模块
本章介绍所有的关于模块和内核编程的关键概念,通过一个 hello world 模块来认识驱动加载的流程及相关细节。
86 0
|
存储 网络协议 算法
Linux 连接跟踪表满怎么处理
Linux 连接跟踪表满怎么处理?
|
Linux
linux下fork函数创建父子进程的目的,模拟服务器与客户端通信
linux下fork函数创建父子进程的目的,模拟服务器与客户端通信
76 0
|
存储 安全 Linux
【操作系统篇】第三篇——进程(概念,组成,状态与转换,控制以及通信)
【操作系统篇】第三篇——进程(概念,组成,状态与转换,控制以及通信)
【操作系统篇】第三篇——进程(概念,组成,状态与转换,控制以及通信)
|
Shell Linux C++
【操作系统】进程间的通信——管道
【操作系统】进程间的通信——管道
|
网络协议
内核怎么帮程序建立连接的(下)
内核怎么帮程序建立连接的(下)
内核怎么帮程序建立连接的(下)