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 的通信。

附录

posted @   jiangbo4444  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2020-08-14 【JavaScript】Object 实例方法
点击右上角即可分享
微信分享提示