TCP/IP包结构和连接的建立与关闭

253 阅读2分钟
IP首部
0  151631
4位版本4位首部长度8位服务类型(TOS)16位总长度(字节)20字节
16位标志3位标志13位片偏移
8位生存时间(TTL)8位协议16位首部检验和
32位源IP地址
32位目的IP地址
32位选项(若有)
数据



UDP首部
0  151631
16位源端口号16目的端口号
16位UDP长度16位UDP校验和
数据(若有)



TCP首部
0  151631
16位源端口号16目的端口号
32位序列号
32位确认号
4位首部长度保留(6位)URGACKPSHRSTSYNFIN16位窗口大小
16位TCP校验和16位紧急指针
32位选项(若有)
数据(若有)

ACK - 应答编号
SYN - 同步包
FIN  - 结束包

连接建立:三次握手
用来建立连接

1. (B) --> [SYN] --> (A)  
假如服务器A和客户机B通讯. 当A要和B通信时,B首先向A发一个SYN (Synchronize)
标记的包,告诉A请求建立连接.  
注意: 一个 SYN包就是仅SYN标记设为1的TCP包(参见TCP包头Resources). 认识
到这点很重要,只有当A受到B发来的SYN包,才可建立连接,除此之外别无他法。因此,
如果你的防火墙丢弃所有的发往外网接口的SYN包,那么你将不能让外部任何主机主动建
立连接。  
2. (B) <-- [SYN/ACK] <--(A)
接着,A收到后会发一个对SYN包的确认包(SYN/ACK)回去,表示对第一个SYN包的确
认,并继续握手操作.  
注意: SYN/ACK包是仅SYN 和 ACK 标记为1的包.
3. (B) --> [ACK] --> (A)

B收到SYN/ACK 包,B发一个确认包(ACK),通知A连接已建立。至此,三次握手完成,
一个TCP连接完成  
注意: ACK包就是仅ACK 标记设为1的TCP包. 需要注意的是当三此握手完成、连接建
立以后,TCP连接的每个包都会设置ACK位  

连接关闭:四次挥手Four-way Handshake
用来关闭已建立的TCP连接 

1. (B) --> ACK/FIN --> (A)
2. (B) <-- ACK <-- (A)
3. (B) <-- ACK/FIN <-- (A)
4. (B) --> ACK --> (A)