网络_TCP连接的建立与释放
三报文握手
1.概述
TCP是面向连接的协议。TCP建立连接的过程叫做握手,握手需要在客户和服务器之间交换三个TCP报文段,即我们说的“三次握手”(严格讲是一次握手过程中交换了三个报文)。
2.过程
一开始客户端和服务器端中的TCP进程都处于关闭状态,假设客户端主动打开连接,服务器端被动打开连接;这时客户端TCP进程创建传输控制模块TCB,服务器端进程也创建传输控制模块TCB并监听客户请求,以便及时响应。
- 第一次
客户端打算建立TCP连接时,向服务器端发送连接请求报文段,其首部中的同步位SYN=1,ACK=0,并选择一个初始序号seq=x,这时客户端TCP进程进入同步已发送状态(SYN-SENT)。 - 第二次
服务器端收到连接请求报文段后,如果同意连接,则向客户端发送确认报文段,其首部中的同步位和ACK位都为1,确认号为ack=x+1,并选择一个初始序号为seq=y,这时服务器端TCP进程进入同步已收到状态(SYN-RCVD)。 - 第三次
客户端收到服务器端的确认后,还需要向服务器端发送确认报文段,其首部中的同步位和ACK位都为1,确认号为ack=y+1,自己的序号为seq=x+1,这时客户端TCP进程进入已建立连接状态(ESTABLISHED)。
当服务器端收到客户端的确认后,也进入已建立连接状态(ESTABLISHED)。
3.过程图示

4.四报文握手
在三报文握手中的第二次报文发送时,可以先发送一个确认报文段(ACK=1,ack=x+1),再发送一个同步报文段(SYN=1,seq=y),这就变成了四报文握手。
四报文挥手
1.概述
TCP释放连接的过程叫做挥手。挥手需要在客户和服务器之间交换四个TCP报文段。
2.过程
数据传输结束后,通信的双方都可释放连接。假设客户端停止发送数据,先主动关闭TCP连接。
- 第一次
客户端TCP进程发送连接释放报文段并进入终止等待1状态(FIN-WAIT-1),其中报文段首部的终止控制位FIN=1,其序号seq=u(u等于已传送过的数据的最后一个字节的序号加1)。 - 第二次
服务器端收到连接释放报文段后发出确认报文段并进入关闭等待状态(CLOSE-WAIT),其中报文段首部确认号为ack=u+1,其序号为seq=v(v等同于u)。
客户端收到服务器端的确认后,进入终止等待2状态(FIN-WAIT-2),等待服务器端发送连接释放报文段。
这时TCP连接处于半关闭状态,即客户端到服务器端的连接释放了,但是服务器端仍可发送数据,客户端仍可以接收数据。 - 第三次
当服务器端停止发送数据,其应用进程会通知TCP释放连接。
服务器端TCP进程发送连接释放报文段并进入最后确认状态(LAST-ACK),其中报文段首部的终止控制位FIN=1,其序号seq=w(半关闭状态时可能发送了数据),确认号ack=u+1。 - 第四次
客户端收到连接释放报文段后发出确认报文段并进入时间等待状态(TIME-WAIT),其中报文段首部的ACK=1,确认号ack=w+1,其序号为seq=u+1。
此时TCP连接还没有释放,等待时间等待计时器设置的2MSL时间后(建议四分钟),客户端才进入关闭状态。
3.图示

几个问题
- 1.三报文握手为什么客户端最后还要发送一次确认呢?
为了防止已失效的连接请求报文段又发给服务器端而产生错误。
比如客户端发送的第一个请求报文段在某些网络节点滞留了,导致连接释放后的某个时间才到达服务器端,服务器端会向客户端发送确认报文段。
如果不采用三报文握手,那么新的连接就建立了,但客户端不知道建立了连接,就不会发送数据导致服务器端一直等待;
而采用三报文握手,客户端不会向服务器端的确认发出确认,服务器端收不到确认,就不会建立连接。 - 2.为什么四报文挥手客户端在时间等待状态需要等待2MSL?
其一是为了保证客户端发送的最后一个确认报文段能到达服务器端。因为最后一个ACK报文段可能丢失,服务器端收不到这个报文段会超时重传FIN报文段,在2MSL时间内客户端能收到重传的FIN报文段并重传ACK报文段,保证客户端和服务器端正常关闭TCP连接。
其二是防止已失效的请求连接报文段出现在本次连接中。客户端在发送完最后一个ACK报文段后经过2MSL时间后,本次连接内的所有报文段将消失,下一次新的连接中就不会有本次的无效的请求连接报文段了。
网络_TCP连接的建立与释放的更多相关文章
- 简述TCP连接的建立与释放(三次握手、四次挥手)
在介绍TCP连接的建立与释放之前,先回顾一下相关知识. TCP是面向连接的运输层协议,它提供可靠交付的.全双工的.面向字节流的点对点服务.HTTP协议便是基于TCP协议实现的.(虽然作为应用层协议,H ...
- 计算机网络(11)-----TCP连接的建立和释放
TCP连接的建立和释放 概述 TCP运输连接的建立和释放是每一次面向连接的通信中必不可少的过程,运输连接有三个阶段:连接建立,数据传送和连接释放. TCP连接的建立 如图所示,假定A主机是客户端程序, ...
- TCP连接的建立与释放(三次握手与四次挥手)
TCP连接的建立与释放(三次握手与四次挥手) TCP是面向连接的运输层协议,它提供可靠交付的.全双工的.面向字节流的点对点服务.HTTP协议便是基于TCP协议实现的.(虽然作为应用层协议,HTTP协议 ...
- Wireshark-TCP协议分析(包结构以及连接的建立和释放)
原文:http://blog.csdn.net/ahafg/article/details/51039584 TCP:传输控制协议 TCP是一种面向连接的.可靠的.基于字节流的传输层通信协议. 面向 ...
- tcp连接的建立与释放
1.TCP是面向连接的协议. 运输连接时用来传送TCP报文的.TCP运输连接的建立和释放是每一次面向连接的通信中必不可少的过程.因此,运输链接就有三个阶段,即:连接建立.数据传送和连接释放. 在TCP ...
- 【网络协议】TCP连接的建立和释放
转载请注明出处:http://blog.csdn.net/ns_code/article/details/29382883 TCP首部格式 先看TCP报文段的格式,例如以下; TCP报文段首部的前20 ...
- TCP连接的建立与释放(超详细)
前言:在计算机网络协议中,TCP只是其中一个,然而在网络使用中,TCP也是最离不开的协议之一,它的重要性毋庸置疑,最最重要的是,面试的重点就是它啊,呜呜~~,今天我们一起来看下TCP的连接建立与释放, ...
- 第三次作业:使用Packet Tracer分析TCP连接的建立与释放过程
0 个人信息 张樱姿 201821121038 计算1812 1 实验目的 使用路由器连接不同的网络 使用命令行操作路由器 通过抓取HTTP报文,分析TCP连接建立的过程 2 实验内容 使用Packe ...
- TCP 连接的建立和释放
TCP(Transmission Control Protocol) 传输控制协议 1.三次握手协议(建立连接) TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: ...
随机推荐
- XMLHttpRequest对象(Ajax)的状态码(readystate) HTTP状态代码(status)
2018-11-28 14:19:00 来自 :XMLHttpRequest对象(Ajax)的状态码(readystate) HTTP状态代码(status) XMLHttpRequest对象(Aj ...
- [博客迁移]探索Windows Azure 监控和自动伸缩系列2 - 获取虚拟机的监控定义和监控数据
上一篇博文介绍了如何连接Windows Azure: http://www.cnblogs.com/teld/p/5113063.html 本篇我们继续上次的示例代码,获取虚拟机的监控定义和监控数据. ...
- spring4.0.0 源码导入eclipse(sts)
其余步骤请见:http://www.cnblogs.com/xiluhua/p/7450972.html 执行 gradle eclipse -x :eclipse 报错: 解决办法: 找到 行,注释 ...
- linux lsof用法
linux lsof命令详解 简介 lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可 ...
- golang学习笔记13 Golang 类型转换整理 go语言string、int、int64、float64、complex 互相转换
golang学习笔记13 Golang 类型转换整理 go语言string.int.int64.float64.complex 互相转换 #string到intint,err:=strconv.Ato ...
- subwoofer
外文名:subwoofer 中文名:重低音音箱 俗 称:低音炮 归 类:音乐器材别 称:重低音音箱 低音炮是大家的一个俗称或者简称,严格讲应该是:重低音音箱.重低音其实是电子音乐里, ...
- linux dns
linux 用户相关的 root 相当于QQ群主 sudo QQ群管理员 普通用户 QQ群水军 root UID 是 0 组UID也是0 普通用户UID从1000开始 查看用户id 信 ...
- oracle 如何将一个字段内容拆分多行显示
例子: select regexp_substr('1,2,3,4,5', '[^,]+', 1, level)from dualconnect by level <= regexp_count ...
- MyEclipse中项目运行时发生了Tomcat报错:[java.lang.OutOfMemoryError: PermGen space]
Tomcat内存溢出,异常信息如下: 十一月 26, 2017 1:52:26 下午 org.apache.catalina.core.ContainerBase$ContainerBackgroun ...
- Oracle笔记 #01# 简单分页
rownum是Oracle为查询结果分配的有序编号(总是从1~n).言下之意,rownum字段本来并不存在于表中,而是经查询后才分配的. 举一个例子: SELECT rownum, name, pri ...