《后台开发核心技术与应用实践》(三)

  • TCP协议
    • 1 TCP协议
    • 2 TCP网络编程API
    • 3 实现一个TCPServer
    • 4TCP协议选项
    • 5 网络字节序与主机序
    • 6 封包和解包
  • 网络IO模型
    • 1四种网络IO模型
    • 2 selectpollepoll用法
  • 网络分析工具
    • 1 ping
    • 2 tcpdump
    • 3 netstat
    • 4 lsof

6. TCP协议

6.1. TCP协议

(1)OSI七层网络模型vs五层网络模型vsTCP/IP四层网络模型

七层 五层 四层
应用层
表示层
会话层 应用层 应用层
传输层 运输层 传输层
网络层 网络层 网间层
数据链路层 数据链路层 网络接口
物理层 物理层

(2)TCP头格式和各字段说明
《后台开发核心技术与应用实践》(三)_第1张图片
(3)TCP状态流转
《后台开发核心技术与应用实践》(三)_第2张图片《后台开发核心技术与应用实践》(三)_第3张图片
(4)TCP超时重传

重传超时时间RTO设置,1s、2s、4s、8s、16s符合Karm算法。待研究。

(5)TCP滑动窗口

  1. “窗口”对应的是一段可以被发送者发送的字节序列,其连续的范围称之为“窗口”;
  2. “滑动”则是指这段“允许发送的范围”是可以随着发送的过程而变化的,方式就是按顺序“滑动”。

(6)TCP拥塞控制

常用方法:
1. 慢开始、拥塞避免
2. 快重传、快恢复

6.2. TCP网络编程API

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。
《后台开发核心技术与应用实践》(三)_第4张图片

6.3. 实现一个TCPServer

参考代码

6.4.TCP协议选项

SO_REUSEADDR等选项,不太懂。

6.5. 网络字节序与主机序

(1)字节序,顾名思义字节的顺序,就是大于一个字节类型的数据在内存中的存放顺序,一个字节的数据没有顺序的问题了。
(2)主机字节序就是我们平常说的大端和小端模式:不同的CPU有不同的字节序类型,这些字节序是指整数在内存中保存的顺序,这个叫做主机序。常见的有两种:a) Little-Endian就是低位字节排放在内存的低地址端;b) Big-Endian就是高位字节排放在内存的低地址端。
(3)网络字节序:4个字节的32 bit值以下面的次序传输:首先是0~7bit,其次8~15bit,然后16~23bit,最后是24~31bit。这种传输次序称作大端字节序。由于TCP/IP首部中所有的二进制整数在网络中传输时都要求以这种次序,因此它又称作网络字节序。
(4)所以,当两台采用不同字节序的主机通信时,在发送数据之前都必须经过字节序的转换成为网络字节序后在进行传输。

6.6. 封包和解包

(1)TCP/IP 网络数据以流的方式传输,数据流是由包组成,如何判定接收方收到的包是否是一个完整的包就要在发送时对包进行处理,这就是封包技术。封包就是给一段数据加上包头,这样一来数据包就分为包头和包体两部分内容了
(2)包头其实上是个大小固定的结构体,其中有个结构体成员变量表示包体的长度,这是个很重要的变量,其他的结构体成员可根据需要自己定义.根据包头长度固定以及包头中含有包体长度的变量就能正确的拆分出一个完整的数据包
(3)利用底层的缓冲区来进行拆包时,由于TCP也维护了一个缓冲区,所以可以利用TCP的缓冲区来缓存发送的数据,这样一来就不需要为每一个连接分配一个缓冲区了.对于利用缓存区来拆包,就是循环不停地接收包头给出的数据,直到收够为止,这就是一个完整的TCP包。

7.网络IO模型

7.1.四种网络IO模型

本书中讲解了四种网络IO模型:阻塞IO模型、非阻塞IO模型、多路IO复用模型、异步IO模型。
《Unix网络编程》一书中提到了五种IO模型,分别是:阻塞IO、非阻塞IO、多路复用IO、信号驱动IO以及异步IO。
《后台开发核心技术与应用实践》(三)_第5张图片

7.2. select、poll、epoll用法

待学习!

8.网络分析工具

8.1. ping

8.2. tcpdump

tcpdump [ -adeflnNOpqStvx ] [ -c 数量 ] [ -F 文件名 ] [ -i 网络接口 ] [ -r 文件名] [ -s snaplen ]
[ -T 类型 ] [ -w 文件名 ] [表达式 ]

一些使用实例
(1)tcpdump -i eth0 host 192.168.0.250 —–在网口eth0上抓取主机地址为192.168.0.250的所有数据包。
(2)tcpdump -i eth0 net 192.168.0.0/24 —— 在网口eth0上抓取网络地址为192.168.0.0/24的所有数据包
(3)tcpdump -i eth0 port 80 —— 在网口eth0上抓取端口为80的所有数据包(注意,这里不区分是源端口还是目的端口)
当然,我们也可以指定源端口或目的端口
(4)tcpdump -i eth0 src port 80 and dst port6100 — 在网口eth0上抓取源端口为80且目的端口为6100的数据包,这里用到了and逻辑运算符,后面再介绍
(5)tcpdump -i eth0 icmp — 在网口eth0上抓取所有icmp协议的数据包

8.3. netstat

netstat [-a][-e][-n][-o][-p Protocol][-r][-s][Interval]

一些使用实例
(1)netstat -a:列出所有端口(包括未监听端口)
(2)netstat -at:列出所有tcp端口
(3)netstat -au:列出所有udp端口
(4)netstat -l:只显示监听端口
(5)netstat -lt:只列出所有监听 tcp 端口
(6)netstat -lu:只列出所有监听 udp 端口
(7)netstat -lx:只列出所有监听 UNIX 端口
(8)netstat -p:在 netstat 输出中显示 PID 和进程名称
(9)netstat -an:在 netstat 输出中不显示主机,端口和用户名。将会使用数字代替那些名称。
(10)netstat -c:持续输出 netstat 信息

8.4. lsof

lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。

一些使用实例
(1)lsof -i :6666:查看6666端口现在运行情况
(2)lsof -a -u root -d txt:查看所属root用户进程所打开的文件,文件类型为.txt
(3)lsof/dev/tty1:监控打开的文件和设备。查看设备/dev/tty1被哪些进程占用
(4)lsof -c server:监控程序。查看指定程序server打开的文件
(5)lsof -u user_name:监控用户。查看指定用户user_name打开的文件

《后台开发核心技术与应用实践》(一)
《后台开发核心技术与应用实践》(二)
《后台开发核心技术与应用实践》(三)
《后台开发核心技术与应用实践》(四)

你可能感兴趣的:(Reading,Notes)