Linux 网络编程学习(网络概要)
关注点:
1.TCP的服务端和客户端,不涉及用户界面;粗略涉及udp,以及udp和tcp的巨大区别,特别再处理并发时候是完全不同的;强调可以测量的性能。
2.避免猜想的优化
错误的认为网络编程尽量避免动态内存分配,杜绝使用STL,但是linux内
核把从网卡收到一个包,传给应用程序的过程涉及到很多内存分配和释放。
网络方面的以太网分层
1. 以太网层(帧)
2. IP层(分组)
注意ip分组和分片的区别
3. TCP层(分节)
3. 应用层(消息)
网络编程几个注意的地方
1. 不要把网络IO和业务逻辑混合在一起
2. 部分人认为TCP不可靠,收到的数据不完整
3. TCP是字节流协议,保证字节按顺序到达,但不保留消息的边界,需要设计TCP分包的逻辑
4. 直接发送C语言的结构体
- 需要考虑结构体的对其,如可以把对齐设为1,但是直接导致第三方lib core dump,因为破坏了API二进制接口
- 高度的不可扩展,如果增加一个字段就会导致客户端和服务端都得重写
5. TCP的自连接:
TCP的客户端往本机的服务端发起连接的时候,如果本机的服务端没有起来,在一定的条件下,客户端会自己和自己建立连接,如localhost:54321<–>localhost:54321,出现自己发数据,自己收到的现象
6.验证以太网有效带宽
nc命令详解.
dd命令详解
远程拷贝文件
从server1拷贝文件到server2上。需要先在server2的1234端口上,用nc激活监听。
[root@server2 ~]# nc -l 5001 > /dev/null
这表示监听server2的5001端口,把收到的数据放入黑洞中
server1:
[root@server1 ~]# dd if=/dev/zero bs=1MB cout=1000 | nc e6400的ip 5001
将本机/dev/zero上的数据,以1000块,每块为1MB的数据发送到e6400这台机器上
把磁盘上得数据发送到本机(从磁盘上读数据不一定比从/zero 上慢)
time命令
server1:
[root@server1 ~]# time nc localhost 5001 < aaa.txt
监控接收数据的进度
pv命令
[root@server2 ~]# nc -l 5001 | pv -w > /dev/null
这表示监听server2的5001端口同时显示接收的进度,把收到的数据放入黑洞中
pv单位用的是二进制的M,dd用的是十进制的
server1:
[root@server1 ~]# dd if=/dev/zero bs=1MB cout=1000 | nc e6400的ip 5001
将本机/dev/zero上的数据,以1000块,每块为1MB的数据发送到e6400这台机器上
如果在一台机器上测试,速度可能会下降,因为一台机器上开了 nc pv dd nc这四个进程,会争用CPU造成速度下降