承接上文网络通讯原理简介以及演示通讯过程
是内核的传输控制层完成的
程序先有连接 才会发送数据 所以该过程是阻塞的
传输控制层
该层的协议有UDP、TCP 面向连接的可靠的传输协议
三次握手让双方都确认自己的输入输出都是通的 双方要为对方在内存中开辟资源 这个资源在每台主机里面 是物理的 为对方提供服务(由谁接收 怎么统计 接收队列长了多少了 ) 这个时候才有了连接 三次握手之后 才允许 程序给传输控制层传输数据
socket
socket中文是套接字 用一个四元组ip:port+ip:port(客户端ip和端口 + 服务端ip和端口)来表示 在linux系统中用一个文件描述符来代表 一个ip可以创建65535个端口 客户端IPA和服务器IPB可以建立65535个连接
IPA可以和IPB之间建立65535个连接 IPA也可以和IPC之间建立65535个连接
netstat -natp
这是一个socket连接表 服务器A可以对服务器B最多能发送65535个连接 但不妨碍对另外一台服务器发送65535个连接 所以有了资源释放的概念即断开连接
四次分手
四次分手形象描述: A:我要和你分手 B:哼(听到了) B:我也想和你分手 A:好啊 如果一方没有发送过来 则另外一方就会进入等待状态
curl www.baidu.com
curl调用了内核的三次握手建立连接 把请求头发送给了对方 对方一定会有响应 它也读到了响应 curl命令最后结束退出 该请求响应的过程 包含了完整的通信过程 三次握手->中间数据传输->四次分手 抓包就抓curl请求的生命周期
抓包命令:tcpdump -nn -i port 80
-nn 表示 不显示明文和localhost等 而是该显示端口显示端口 该显示ip显示ip -i 表示 inteface 你要抓的是哪个接口 port 抓数据包里面有80端口号 因为访问百度走的80
查看网卡接口名字:ifconfig
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
本地给百度发送请求头
nc www.baidu.com 80
类似于telnet 可以和别人建立远程连接 但是它只完成了tcp socket的三次握手
两次换行才能把整个头发送出去 抓包可以看到 本地发送了请求头给百度 百度返回了响应头 然后四次分手
四次分手可以粘成3个包