3. 客户必须再次回应服务器端一个ACK确认数据段(这里的Seq为x+1)。
经过上面3个过程就建立了一个tcp连接,接着就可以发送数据了,因为建立连接使用了一个序列号x,所以发送数据的第一个字节序号为x+1。
注意:这里tcp为应用层提供全双工服务,意味数据能在两个方向上独立地进行传输,因此连接的每一段都有各自的传输数据序号(对应于上图中的x和y,这两个值是没有必然联系的)。
Wireshark抓包分析TCP3次握手
下面通过利用http应用层连接一个网络,实现tcp的3次握手和简单的数据交换过程,下面通过抓包来实际观察这个过程,首先我们先看看抓到的包:
从第一行的tcp往下看,前面3个tcp包为3次握手的过程,接着http包说明成功建立连接,主机向服务器发送一个http应用请求,服务器收到请求后,返回一个tcp确认帧,接着发送一个http应答给主机,主机收到服务器的http应答数据后,又发送一个tcp确认帧,确认收到了数据。查询服务器ip地址这样图中的前7个包实现了主机和服务器建立连接,并实现一次简单的数据请求应答过程。即下图所示的交互按键回显过程:
接下来是按照顺序的7个数据帧的数据结构。数据帧顺序分别为:
1. 主机发起一个tcp连接请求(tcp),
2. 服务器响应连接请求(tcp),
3. 主机返回ACK完成3次握手成功建立连接(tcp),
4. 主机发送一个http网页请求(http),
5. 服务器收到请求返回一个ACK帧(tcp),
6. 服务器根据请求发送数据到主机(http),
7. 主机收到服务器数据返回一个ACK帧(tcp),具体帧细节见下图:

TCP连接的释放
当通信双方完成数据传输,需要进行TCP连接的释放,由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。因为正常关闭过程需要发送4个TCP帧,因此这个过程也叫作4次挥手。具体过程如下图:
过程(默认客户端发起关闭):
1. TCP客户端发送一个FIN,关闭客户端到服务器端的数据传送。(客户端不再发送报文给服务器端,但可接受服务器端报文)
2. 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。
3.服务器关闭客户端的连接,发送一个FIN给客户端。(服务器端关闭到客户端的数据传送)
4.客户段发回ACK报文确认,并将确认序号设置为收到序号加1。
下面通过wireshark抓包了解具体的释放连接过程,通过断开一个连接,抓取到4个TCP帧,帧顺序依次为:
1. 主动关闭放发送一个FIN帧给被动方
2. 被动方收到关闭信息返回一个确认ACK帧
3. 被动方发送一个FIN帧给主动方
4. 主动方收到被动方的FIN关闭信息返回一个ACK帧,连接释放
下面为按照顺序的帧数据结构详细信息:
TCP的最大报文段长度
上面介绍了TCP连接的建立和释放过程,下面介绍一下TCP的最大报文段长度。
最大报文段长度(MSS)表示TCP传往另一端的最大块数据的长度。当一个连接建立时,连接的双方都要通告各自的MSS。一般来说,MSS越大越好,因为报文段越大允许每个报文段传送的数据就越多,相对IP和TCP首部有更高的网络利用率。
MSS选项只能出现在SYN报文段中,所以只能在SYN=1的帧中才会有MSS选项说明报文的最大段长度。
具体参考:
?url=c-fTckuehGMSiI5c2xCQDe3MUOKRwgdK6Q4CeO3tms8s6V3hIv5OmOQvUJvp67e90jUDAIjZfmhk8deiIjw1tK
其他
关于TCP的内容还有很多,这里不再详细说明,但是需要知道,TCP连接的建立和释放还有几种比较特殊的情况,同时打开(SYN)建立连接,同时关闭或半关闭来释放连接的情况都是存在的,还有一些TCP的可选字段,这里都不再讲了,具体可以参考:TCP/IP 详解卷1。查询服务器ip地址
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-67780-2.html
一楼
不是秀肌肉的问题