TCP原理总结——浅谈三次握手和四次挥手
TCP原理
TCP套接字中的I/O缓冲
write函数调用后并非立即传输数据,read函数调用后也并非马上接收数据。
write函数调用瞬间,数据将移至输出缓冲;
read函数调用瞬间,从输入缓冲读取数据。
缓冲特性:
补充*:
位码即tcp标志位,有6种表示:
SYN(synchronous建立连接)
ACK(acknowledgement 表示响应、确认)
PSH(push表示有DATA数据传输)
FIN(finish关闭连接)
RST(reset表示连接重置)
URG(urgent紧急指针字段值有效)
TCP内部工作原理1:与对方套接字的连接
TCP在实际通信过程中会经过三次对话过程。该过程成为三次握手。
接下来给出连接过程中实际交换的信息格式:
套接字是以全双工方式工作的。可以双向传递数据。
收发数据前需要做一些准备。
三次握手Three-way Handshake
一个虚拟连接的建立是通过三次握手来实现的
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连接完成
Note: ACK包就是仅ACK 标记设为1的TCP包.
需要注意的是当三此握手完成、连接建立以后,TCP连接的每个包都会设置ACK位
握手阶段:
序号 方向 seq ack
1 A->B 10000 0
2 B->A 20000 10000+1=10001
3 A->B 10001 20000+1=20001
解释:
1:A向B发起连接请求,以一个随机数初始化A的seq,这里假设为10000,此时ACK=0
2:B收到A的连接请求后,也以一个随机数初始化B的seq,这里假设为20000,意思是:你的请求我已收到,我这方的数据流就从这个数开始。B的ACK是A的seq加1,即10000+1=10001
3:A收到B的回复后,它的seq是它的上个请求的seq加1,即10000+1=10001,意思也是:你的回复我收到了,我这方的数据流就从这个数开始。A此时的ACK是B的seq加1,即20000+1=20001
TCP的内部工作原理2:与对方主机的数据交换
通过三次握手过程完成了连接。下面正式开始收发数据。
-首先,主机A通过1个数据包发送100个字节的数据,数据包的SEQ为1200。
-主机B确认这一点,向主机A发送ACK1301消息 (ACK号 -> SEQ号 + 传递的字节数 + 1)最后加1为了告知对方下次要传 递的SEQ号。
-.......
与三次握手协议相同,最后加1是为了告知对方下次要传递的SEQ号。下面分析传输过程中数据包消失的情况:
SEQ1301包向主机B传递100字节数据,但中间发生了错误,主机B未收到。经过一段时间后,主机A仍为收到对于SEQ1301的ACK确认。因此试着重传该数据包。
为了完成数据包重传,TCP套接字启动计时器以等待ACK应答。若计时器超时则重传。
TCP的内部工作原理3:断开与套接字的连接
四次挥手Four-way handshaking
先由A向套接字B传递断开连接的消息(FIN),套接字B发出确认收到的消息(ACK),然后向套接字A传递可以断开连接的消息(FIN),套接字A同样发出确认消息(ACK)。
数据包中的FIN表示断开连接。双方各发送一次FIN消息后断开连接。
这个过程称为四次挥手。
全过程配图: