拔掉网线后的 TCP 连接

首先,TCP 连接在 Linux 内核中是一个名为 struct socket 的结构体,该结构体的内容包含 TCP 连接的状态等信息。当拔掉网线的时候,操作系统并不会变更该结构体的任何内容,所以 TCP 连接的状态暂时也不会发生改变。

主要得看拔掉网线后,两端做了什么动作,有没有进行数据传输。分场景来讨论:有数据传输、没有数据传输。

一、拔掉网线后,有数据传输

在客户端拔掉网线后,服务端向客户端发送的数据报文会得不到任何的响应,在等待一定时长后,服务端就会触发超时重传机制,重传未得到响应的数据报文。

  • 如果在服务端重传报文的过程中,客户端刚好把网线插回去了,由于拔掉网线并不会改变客户端的 TCP 连接状态,并且还是处于 ESTABLISHED 状态,所以这时客户端是可以正常接收服务端发来的数据报文的,然后客户端就会回 ACK 响应报文。此时,客户端和服务端的 TCP 连接依然存在的,就感觉什么事情都没有发生。
查看更多

TCP 的保活机制

TCP 的 keepalive 机制,如果在一段时间内,客户端和服务端之间没有任何报文传输,那么 TCP 的保活机制就会开始起作用。他会每隔一定的时间间隔,发送一个探测报文,如果连续的探测报文都没有得到响应,则认为当前的 TCP 连接已经死亡,操作系统便将错误信息通知给上层应用程序。

内核提供了一些参数可以用来设置保活机制。包括:保活时间、保活探测的次数、保活探测的时间。

  • net.ipv4.tcp_keepalive_time=7200 表示保活时间是 7200 秒,也就是 2 小时内如果没有任何连接相关的报文,就会启动保活机制
  • net.ipv4.tcp_keepalive_intvl=75 每次检测间隔为 75 秒
查看更多

查看更多

函数的调用约定

本文列举几个常见的函数调用约定,并以汇编语言的形式进行解释

  • __cdecl ( C Declaration 的缩写):c 语言默认方式,参数从右向左入栈,主调函数负责栈平衡。函数名进行修饰时,会加前导下划线。
  • __stdcall:windows API 默认方式,参数从右向左入栈,被调函数负责栈平衡,函数名进行修饰时,会加上前缀下划线,并且后面紧跟一个 @ 符号,其后紧跟着参数的大小。
  • __fastcall:快速调用方式。这种方式选择将参数优先从寄存器传入(ECX 和 EDX),剩下的参数再从右向左从栈传入。寄存器传参要比栈传参快,因此名为:__fastcall。由被调函数负责栈平衡。
查看更多

内联汇编

一、GCC 汇编语法

1. 源操作数和目的操作数顺序

AT&T 语法的操作数方向和 Intel 语法的刚好相反。在Intel 语法中,第一操作数为目的操作数,第二操作数为源操作数,然而在 AT&T 语法中,第一操作数为源操作数,第二操作数为目的操作数。

也就是说,Intel 语法中的 “Op-code dst src” 变为 AT&T 语法中的 “Op-code src dst”。

2. 寄存器命名

寄存器名称有 “%” 前缀,即如果必须使用 “eax”,它应该用作 “%eax”。

3. 立即数

AT&T 立即数以 “$” 为前缀。静态 “C” 变量也使用 “$” 前缀。在 Intel 语法中,十六进制常量以 “h” 为后缀,然而 AT&T 不使用这种语法,这里我们给常量添加前缀 “0x”。所以,对于十六进制,我们首先看到一个 “$”,然后是 “0x”,最后才是常量。

4. 操作数大小

在 AT&T 语法中,存储器操作数的大小取决于操作码名字的最后一个字符。操作码后缀 ’b’ 、’w’、’l’ 分别指明了字节(8位)、字(16位)、长型(32位)存储器引用。Intel 语法通过给存储器操作数添加 “byte ptr”、 “word ptr” 和 “dword ptr” 前缀来实现这一功能。

查看更多
类别 项目名
1
2
nasm -f elf -o xxx.o xxx.s
ld -m elf_i386 -s -o xxx.bin xxx.o

下断点,在 bochs 的配置文件加入 “magic_break: enabled=1”,作用是 bochs 启动时开启魔术断点调试功能

1
2
xchg bx, bx
asm volatile ("xchg %%bx, %%bx" ::);

查看更多

课程笔记

CISC(复杂指令集):Intel 芯片

RISC(精简指令集):ARM 芯片、MAC m1、m2 芯片

disas /r :查看汇编的时候,显示机器码

汇编中,函数的返回值一般在 eax 中。ecx 寄存器一般存储循环次数

寄存器中以 e 开头的,就是 32 位寄存器。如果以 r 开头,就是 64 位寄存器。

查看更多