0230-TCP 发送和接收
环境
- Time 2022-11-25
- WSL-Ubuntu 22.04
- Rust 1.65.0
前言
说明
参考:https://doc.rust-lang.org/std/net/struct.TcpListener.html
目标
之前认识了 TCP 报文头,这里去除报文头的细节,直接通信。
main.rs
TCP 由标准库直接支持,可以直接使用。
连接上去后,服务器返回一个 hello。
use std::{io::Write, net::TcpListener};
fn main() -> std::io::Result<()> {
let listener = TcpListener::bind("127.0.0.1:4444")?;
for stream in listener.incoming() {
stream?.write_all("hello".as_bytes())?;
}
Ok(())
}
发送请求
root@jiangbo12490:~# nc 127.0.0.1 4444
hello^C
TCPDUMP 抓包
oot@jiangbo12490:~# tcpdump -A -n -i lo port 4444
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
21:57:44.763832 IP 127.0.0.1.47456 > 127.0.0.1.4444: Flags [S], seq 4268043973, win 65495, options [mss 65495,sackOK,TS val 456644871 ecr 0,nop,wscale 7], length 0
E..<..@.@............`.\.e...........0.........
.7..........
21:57:44.763839 IP 127.0.0.1.4444 > 127.0.0.1.47456: Flags [S.], seq 2090178755, ack 4268043974, win 65483, options [mss 65495,sackOK,TS val 456644871 ecr 456644871,nop,wscale 7], length 0
E..<..@.@.<..........\.`|....e.......0.........
.7...7......
21:57:44.763845 IP 127.0.0.1.47456 > 127.0.0.1.4444: Flags [.], ack 1, win 512, options [nop,nop,TS val 456644871 ecr 456644871], length 0
E..4..@.@............`.\.e..|........(.....
.7...7..
21:57:44.763923 IP 127.0.0.1.4444 > 127.0.0.1.47456: Flags [P.], seq 1:6, ack 1, win 512, options [nop,nop,TS val 456644871 ecr 456644871], length 5
E..9.Z@.@..b.........\.`|....e.......-.....
.7...7..hello
21:57:44.763943 IP 127.0.0.1.47456 > 127.0.0.1.4444: Flags [.], ack 6, win 512, options [nop,nop,TS val 456644871 ecr 456644871], length 0
E..4. @.@............`.\.e..|........(.....
.7...7..
21:57:44.763951 IP 127.0.0.1.4444 > 127.0.0.1.47456: Flags [F.], seq 6, ack 1, win 512, options [nop,nop,TS val 456644871 ecr 456644871], length 0
E..4.[@.@..f.........\.`|....e.......(.....
.7...7..
21:57:44.806605 IP 127.0.0.1.47456 > 127.0.0.1.4444: Flags [.], ack 7, win 512, options [nop,nop,TS val 456644913 ecr 456644871], length 0
E..4.!@.@............`.\.e..|........(.....
.7.1.7..
21:57:50.407455 IP 127.0.0.1.47456 > 127.0.0.1.4444: Flags [F.], seq 1, ack 7, win 512, options [nop,nop,TS val 456650514 ecr 456644871], length 0
E..4."@.@............`.\.e..|........(.....
.7...7..
21:57:50.407475 IP 127.0.0.1.4444 > 127.0.0.1.47456: Flags [.], ack 2, win 512, options [nop,nop,TS val 456650514 ecr 456650514], length 0
E..4..@.@.<..........\.`|....e......T......
.7...7..
一共 9 次报文交换,三次握手,一次数据发送,一次数据确认,四次挥手。
总结
使用 Rust 的标准库,实现 TCP 的通信。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2020-08-14 【JavaScript】Object 实例方法