初识Socket,通过抓包分析TCP的三次握手,四次挥手

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初识Socket,通过抓包分析TCP的三次握手,四次挥手相关的知识,希望对你有一定的参考价值。

参考技术A 通过这张图,我们更容易的去理解这些API,客户端和服务端的不同点就是建立连接部分。服务端需要bind listen accept ,多个客户端可以连接一个服务端。

连接上Socket后,发消息时,用Wireshark网络封包分析工具,抓到以下数据。我们来看一下TCP的三次握手。

用上面蓝色线代表服务端,下面代表客户端。中间箭头代表发起和响应的网络请求。绿色框代表滑动窗口。

滑动窗口是控制接收以及同步数据范围的,通知发送端目前接收的数据范围,用于流量控制,接收端使用。

拥塞窗口是控制发送速率的,避免发的过多,发送端使用。

两个窗口的维护是独立的,滑动窗口主要由接收方反馈缓存情况来维护,拥塞窗口主要由发送方的拥塞控制算法检测出的网络拥塞程度来决定的。

Scoket连接和HTTP连接的区别

GET和POST的区别:

参考资料: https://objccn.io/issue-10-6/

SocketDemo: https://github.com/TeeMoYan/TMSocketDemo.git

抓包分析TCP的三次握手和四次握手

问题描写叙述:

       在上一篇《怎样对Android设备进行抓包》中提到了,server的开发者须要我bug重现然后提供抓包给他们分析。所以抓好包自己也试着分析了一下。发现里面全是一些TCP协议和HTTP协议。所以要想进行抓包分析,必须先了解TCP的原理。这里介绍了TCP的建立连接的三次握手和断开连接的四次握手。


问题分析:


1、TCP建立连接的三次握手


1、1前言:介绍三次握手之前,先介绍TCP层的几个FLAGS字段,这个字段有例如以下的几种标示

SYN表示建立连接,

FIN表示关闭连接。

ACK表示响应,

PSH表示有 DATA传输数据,

RST表示连接重置。


1、2 三次握手的步骤

第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到server,主机B由SYN=1知道,A要求建立联机;

 第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1。ack=1,随机产生seq=7654321的包。

 第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1。以及位码ack是否为1。若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。

 完毕三次握手,主机A与主机B開始传送数据。

从抓包分析中能够非常清晰的看到TCP三次握手。下图就是完整的三次握手。client41826port和server的80port建立了连接

技术分享


2、tcp断开连接的四次握手

tcp断开连接有两种方式,第一种是正常的四次握手断开的,另外一种是RST异常断开的


2、1 正常断开的四次握手:

下图来自网络

技术分享

假设Client端发起中断连接请求,也就是发送FIN报文。

Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了"。可是假设你还有数据没有发送完毕。则不必急着关闭Socket,能够继续发送数据。所以你先发送ACK。"告诉Client端,你的请求我收到了,可是我还没准备好。请继续你等我的消息"。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完毕,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。Client端收到FIN报文后,"就知道能够关闭连接了。可是他还是不相信网络。怕Server端不知道要关闭。所以发送ACK后进入TIME_WAIT状态。假设Server端没有收到ACK则能够重传

“。Server端收到ACK后,"就知道能够断开连接了"。Client端等待了2MSL后依旧没有收到回复。则证明Server端已正常关闭,那好。我Client端也能够关闭连接了

Ok,TCP连接就这样关闭了!


2、2 用抓包来看断开连接的四次握手

下图中的四个箭头就是标准的四次握手了。

首先server80port想41826port发出FIN的断开连接请求

然后第二个箭头41826收到请求之后想server80port回复了一个ACK

接着第三个箭头41826向server80port发送断开请求FIN

最后第四个箭头,server80向client发送断开的回复ACK

这样四次握手之后,server和client都确认了断开连接,能够看到断开连接是双向的。

技术分享


2、3 RST异常关闭连接

有时候也会出现异常断开连接的情况,也就是RST。比方说下图,server80向client32875发送断开请求FIN,client也通过这条链路回复了ACK,可是此时还有数据须要发送。所以没有急着回复FIN,而是先将get请求发送出去,发送了get请求之后再发送的断开请求FIN。可是此时server不知道什么原因在没有确认client的确认前就断开了,所以在接到get请求之后,返回了一个RST,异常断开了这条链路。

技术分享


结论:

TCP的三次握手和四次握手平时看书本看起来非常生涩难懂,可是通过一次http的抓包分析之后,对于tcp的七次握手有了新的了解和认识。

这些理论知识我还是了解的不够深入,仅仅是学以致用,用来分析网络抓包。只是要想做好网络应用,还是非常有必要对tcp,http做深入一点的了解


















以上是关于初识Socket,通过抓包分析TCP的三次握手,四次挥手的主要内容,如果未能解决你的问题,请参考以下文章

TCP协议详解(图解三次握手四次挥手)

TCP协议详解(图解三次握手四次挥手)

基于wireshark抓包分析TCP的三次握手

三次握手四次挥手之抓包讲解

一个抓包案例分析 TCP 的三次握手/四次挥手

一个抓包案例分析 TCP 的三次握手/四次挥手