1.tcpdump使用 2.TCP三次握手
3.TCP与UDP的区别 4.TCP建立连接之后如何传输数据 A向B发送数据的情况(PacketB初始为建立连接时,第二次握手时B发的确认包)
A发送数据包:A向B发送数据包packetA(序列号=packetB.确认号,确认号=packetB.序列号) B发送确认包:B收到数据包packetA,向A发送确认包packetB(序列号=packetA.确认号,确认号=packetA.序列号+packetA.有效载荷) A接收确认包:A收到确认包packetB,从重发队列删除packetA,并继续发送 B向A发送数据的情况(PacketA初始为建立连接时,第三次握手时A发的确认包)
B发送数据包:B向A发送数据包packetB(序列号=packetA.确认号,确认号=packetA.序列号) A发送确认包:A收到数据包packetB,向B发送确认包packetA(序列号=packetB.确认号,确认号=packetB.序列号+packetB.有效载荷) B接收确认包:B收到确认包packetA,从重发队列删除packetB,并继续发送 数据发送过程同时进行,即上述两个过程并行。 使用滑动窗口,使的发送方在没有接收到确认包之前可以发送多个数据包。
5.TCP滑动窗口 https://blog.csdn.net/wdscq1234/article/details/52444277
所有的TCP/IP调优参数都位于/proc/sys/net/目录. 例如, 下面是最重要的一些调优参数, 后面是它们的含义:
- /proc/sys/net/core/rmem_max — 最大的TCP数据接收缓冲
- /proc/sys/net/core/wmem_max — 最大的TCP数据发送缓冲
- /proc/sys/net/ipv4/tcp_timestamps — 时间戳在(请参考RFC 1323)TCP的包头增加12个字节
- /proc/sys/net/ipv4/tcp_sack — 有选择的应答
- /proc/sys/net/ipv4/tcp_window_scaling — 支持更大的TCP窗口. 如果TCP窗口最大超过65535(64K), 必须设置该数值为1
- rmem_default — 默认的接收窗口大小
- rmem_max — 接收窗口的最大大小
- wmem_default — 默认的发送窗口大小
- wmem_max — 发送窗口的最大大小
6.虚拟(swap)和物理内存的区别 windows: 虚拟内存 linux: swap分区
物理内存:即随机存取存储器(random access memory,RAM),是与CPU直接交换数据的内部存储器(主存/内存)
swap分区:在系统的物理内存不够用时,把硬盘空间中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到swap分区中,等到那些程序要运行时,再从swap分区中回复保存的数据到内存中。
7.python内存划分 8.python2和python3的区别 9.生成器和装饰器的区别
10.python函数参数 位置参数:在给函数传参数时,按照顺序,依次传值 默认参数: 在写函数的时候直接给参数传默认的值,调用的时候,默认参数已经有值,就不用再传值了 可变参数:*args 关键字参数:**kwargs 命名关键字参数:
作用:限制要传入的参数的名字,只能传我已命名关键字参数。
特征:命名关键字参数需要一个特殊分隔符*,而后面的参数被视为命名关键字参数。示例如下
def personinfo(name, age, *, gender, city): #只能传递gender和city参数
print(name, age, gender, city)
>>> personinfo('Steve', 22, gender = 'male', city = 'shanghai')
Steve 22 male shanghai
关键字参数和命名关键字参数的区别在于,前者可以传递任何名字的参数,而后者只能传递*后面名字的参数。
如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了:
def personinfo(name, age, *args, gender, city): #args可以传递一个list 其后只能传递gedner和city参数
print(name, age, gender, city)
>>> personinfo('Steve', 22, gender = 'male', city = 'shanghai')
Steve 22 male shanghai
注意事项: ①位置参数在前,默认参数在后,否则python解释器会报错 ②默认参数一定要指向不变对象!指向不变对象!指向不变对象!
11.函数传参dict是值引用还是引用传递? 引用传递
12.python 类语法中有三种方法,实例方法,静态方法,类方法 实例方法只能被实例对象调用,第一个参数是self; 静态方法(由@staticmethod装饰的方法),不需要额外的参数; 类方法(由@classmethod装饰的方法),可以被类或类的实例对象调用,第一个参数是class;
在父子继承过程的各个方法的变化如下: # coding:utf-8 class Foo(object): X = 1 Y = 14
@staticmethod
def averag(*mixes): # "父类中的静态方法"
return sum(mixes) / len(mixes)
@staticmethod
def static_method(): # "父类中的静态方法"
print "父类中的静态方法"
return Foo.averag(Foo.X, Foo.Y)
@classmethod
def class_method(cls): # 父类中的类方法
print "父类中的类方法"
return cls.averag(cls.X, cls.Y)
class Son(Foo):
X = 3
Y = 5
@staticmethod
def averag(*mixes): # "子类中重载了父类的静态方法"
print "子类中重载了父类的静态方法"
print "666 ",mixes
return sum(mixes) / 3
p = Son()
print "result of p.averag(1,5)"
print (p.averag(1,5))
print "result of p.static_method()"
print(p.static_method())
print "result of p.class_method()"
print(p.class_method())
13.TCP挥手
状态机: ①client 发送终止包 FIN=1,seq=u ②client 处于FIN-WAIT-1 ③server 收到终止包并回复确认包 ACK=1,seq=v,ack=u+1 ④server 处于 CLOSE-WAIT ⑤client 收到确认包 ⑥client 处于 FIN-WAIT-2 ⑦server 可能还有数据传输 ⑧server 发送终止包 FIN=1,ACK=1,seq=w,ack=u+1 ⑨server 处于LAST-ACK ⑩client 收到终止包 ⑪client 处于 TIME-WAIT 等待 2MSL 后 CLOSED ⑫server 收到终止包后 CLOSED
client 挥手状态机
server 挥手状态机
参考
https://blog.csdn.net/helloxiaozhe/article/details/79940321 https://blog.51cto.com/net881004/2164024