收藏乱七八糟风暴

TCP详解+wireshark抓包演示

2017-09-22  本文已影响59人  第八区

简介

TCP理论

TCP提供了一种面向连接的、可靠的字节流服务。
面向连接:接双方在通信前需要预先建立一条连接,这犹如实际生活中的打电话。

TCP连接必须要经历三次握手,而释放一个TCP连接需要四次握手,这是由TCP的半关闭特性造成的。因为TCP连接时全双工的,因此,需要TCP两端要单独执行关闭。值得注意的是,主动关闭的一端在发送FIN之后,依然还能正常接收对方的数据,只是通知对方它已经没有数据需要发送了,同理,被动关闭的一端在收到FIN之后,仍然可以发送数据,直到它自身同样发出FIN之后,才停止发送数据。

TCP报文格式

TCP_format.jpg

三次握手

三次握手图解
TCP_hand.jpg

完成了三次握手,客户端和服务器端就可以开始传送数据。

为什么要三次握手呢?

防止已失效的连接请求报文突然又传送到了服务端。
所谓“已失效的连接请求报文”是这样产生的。

四次分手

TCP连接时全双工的,因此,需要TCP两端要单独执行关闭。简单来说A、B两端,A提出断开连接,则发包告诉B,让B不要发数据了。B收到后就对A做一个回应,然后再发一个包给A,告诉A不要再发数据了,B就关闭自己的发送通道,A收到B的关闭请求后,也做出回应。然后关闭自己的发送通道。

四次分手图解
TCP_bye_img.jpg

当客户端没有数据要发送是就要释放客户端这边的请求,客户端会发送一个报文(没有数据),Flags设置为FIN=1。服务端收到报文后先响应一个报文,接着再向客户端请求连接释放,也是FIN。客户端收到回复后再回复一个确认信息,并进入TIME_WAIT状态,等待2MSL时间。

其他情况:
  服务端向客户端发送 FIN = 1 的释放连接请求,但这个报文丢失了, A没有接到不会发送确认信息, 服务端 超时会重传,这时客户端 WAIT_TIME 还能够接收到这个请求,这时再回复一个确认就行了。(客户端收到 FIN = 1 的请求后 WAIT_TIME会重新记时)
  另外服务端存在一个保活状态,即如果客户端突然故障死机了,那服务端那边的连接资源什么时候能释放呢? 就是保活时间到了后,服务端会发送探测信息, 以决定是否释放连接。
注意:这里我们假设是客户端连接断开的发起方,如果是服务端,流程还是一样。

TCP的半关闭

TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力,这就是TCP的半关闭。
半关闭的产生:
客户端发送FIN,另一端发送对这个FIN的ACK报文段。 此时客户端就处于半关闭。

实战抓包演示(Wireshark)

操作步骤:
START_server.png
抓包结果
TCP2.png
第一次握手:

这里的截图我们只接到传输层的协议部分。
向着服务端发送一个Syn的报文。其中Sequence Number=0


TCP_hand_1.png

第二次握手:
服务端向客户端发一个Acknowledgment和Syn的报文。Acknowledgment number=1
Sequence number =0


TCP_hand_2.png

第三次握手:
客户端发向服务端一个Acknowledgment的报文。Acknowledgment number=1
Sequence number =1
然后连接建立完成


TCP_hand_3.png

第一次发送数据

TCP_send_1.png

\

第二次发送数据

TCP_send_2.png

第一次分手:

TCP_bye_1.png

第二次分手:

TCP_bye_2.png

第三次分手

TCP_bye_3.png

第四次分手

TCP_bye_4.png
上一篇下一篇

猜你喜欢

热点阅读