TCP传输连接管理
TCP传输连接管理
一、传输连接的三个阶段
1.1.概述
传输连接就有三个阶段,即:连接建立、数据传送和连接释放。
连接建立过程中要解决以下三个问题:
- 要使每一方能够确知对方的存在。
- 要允许双方协商一些参数(如最大报文段长度,最大窗口大小,服务质量等)。
- 能够对运输实体资源(如缓存大小,连接表中的项目等)进行分配。
TCP 连接的建立都是采用客户服务器方式。
主动发起连接建立的应用进程叫做客户(client)。
被动等待连接建立的应用进程叫做服务器(server)。
二、TCP 的连接建立
2.1.用三次握手建立 TCP 连接
当客户端A想要访问服务器B上的服务,需要与B建立连接了,就要经历如下三次握手过程:
第一次握手:A先向B发送一个同步数据包(报文)。
在报文的TCP首部中:标志位:同步SYN为1,表示这是一个请求建立连接的数据包;确认标记位ACK为0,说明该数据包的确认号无效,所以该标志位可省略;序号
Seq=x
,x
为所传送数据的第一个字节的序号。第二次握手:B收到A发送的第一个数据包后,根据标志位SYN=1与ACK=1,判断出为主动建立连接的数据包。若B同意连接,则B发送一个数据包进行回应。
在数据包的TCP首部中:标志位:同步SYN=1;标志位:确认ACK=1;序号seq=y,y的值由B指定表示B发送数据时的第一个数据字节的序号;确认号ack=x+1,表示已经收到A发送的x个字节数据,并告诉A下次应从数据的第x+1个字节开始发送。
注意区分ACK和ack:在TCP首部中前者为标志位确认 ACK ——占 1 字节,只有当 ACK = 1 时确认号字段才有效。当 ACK = 0 时,确认号无效。;后者为确认号字段——占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。
第三次握手:A收到B的确认之后,再给A发送一个数据包。
在数据包的TCP首部中:已经没有有效的标志位:同步SYN了(即SYN=0),表示双方已同意建立连接;标志位确认ACK=1,表示收到B的确认数据包;序号seq=x+1,表示发出的数据包就是数据的第x+1个字节;确认号ack=y+1,表示收到了B发送y字节数据,并告诉B下次应从数据的第y+1个字节开始发送。
2.2.为何有第三次握手?
客户端向服务器发出建立连接的请求以及服务器向客户端确认这个请求,这两个数据包(前两次握手)足以证明客户端与服务器之间的网络是畅通的,并且协商数据通信所需要的参数。比如协商接收窗口大小,所支持的数据包最大字节数等。
如果没有最后一个数据包确认(第三次握手),A先发出一个建立连接的请求数据包,由于网络原因绕远路了。A经过设定的超时时间后还未收到B的确认数据包,于是发出第二个建立连接的请求数据包,这次网路通畅,数据包很快到达B,B的确认数据包也很快就到达A。于是A与B开始传输数据,过了一会A第一次发出的建立连接的请求数据包到达了B,B以为是再次建立连接,所以又发出一个确认数据包。由于A已经收到了一个确认数据包,所以会忽略B发来的第二个确认数据包,但是B发出确认数据包之后就要一直等待A的回复,而A永远也不会回复。由此造成服务器资源浪费,这种情况多了B计算机可能就停止响应了。
第三次握手(第三个数据包)作用在于,告诉B计算机,B第二次握手发给A的确认数据包A收到了,是有效的。避免B计算机等待造成资源浪费。随后A与B可进行下一步的通信。
2.3.三次握手建立TCP连接过程的各状态
A发出请求建立连接的数据包之后进入SYN-SENT状态,表示发送了请求建立连接的同步数据包。
B收到A发出的请求建立连接的数据包之后,结束LISTEN状态,进入SYN-RCVD状态并向A发出确认数据包。
A收到确认数据包之后,结束SYN-SENT状态,进入ESTABLISHED状态,并向B发送确认数据包。
B收到A的确认数据包之后,结束SYN-RCVD状态,进入ESTABLISHED状态。
A与B都进入ESTABLISHED状态之后,开始传输数据,由此完成三次握手。
查看这些状态
可通过:
netstat -n
在命令行窗口查看计算机建立的会话的装态。由于建立TCP连接的三次握手过程非常快,我们可以通过访问一个不存在的网址来查看:比如http://192.168.80.200
可以看到建立TCP连接时,本计算机访问了该地址的80端口(对应Web服务),并且TCP连接状态为SYN-SENT。此外本计算机还有其他已经建立的TCP连接,状态为ESTABLISHED。
如何查看SYN-RCVD状态呢?可通过模拟SYN攻击(大量模拟虚构地址与本计算机建立会话)即可查看该状态:
框内为SYN攻击虚构的地址,可看到建立TCP连接的会话都处于SYN-RECEIVED状态。
那么平常如果看到计算机有大量处于SYN-RECEIVED状态的会话说明有人利用SYN攻击器在攻击你的电脑。
三、TCP的连接释放
3.1.使用四次挥手释放TCP连接
数据传输结束后,通信的双方都可主动释放连接。下为A主动释放TCP连接。
第一次挥手:首先A向B发送连接释放请求报文(数据包),并停止发送数据。
在连接释放报文(数据包)的TCP首部中:标志位:终止FIN=1,意味着A要主动释放A—>B的TCP连接;序号位seq为u,u值由A指定。随后等待B的确认。
第二次挥手:B收到连接释放报文之后,给A发送确认报文,此时TCP服务器进程通知高层应用进程,这样从A到B这个方向上的连接就释放了,TCP连接处于半关闭状态。此时A没有数据要发给B了,但是B还有数据要发送给A,A仍可以接收。
在确认报文的TCP首部中:标志位:确认ACK=1,表示收到了A发送的数据包,同意A释放连接;序号位seq=v,v值由B指定;确认号ack=u+1,表示已经收到A发送的u个字节数据,并告诉A下次应从数据的第u+1个字节开始发送,下面同理;此时B还可以向A传输数据。
第三次握手:若B已经没有向A发送的数据了,其应用进程就通知TCP释放连接,并向A发送确认报文。
在确认报文的TCP首部中:标志位:确认ACK=1,表示B已经把需要发给A的数据发完了;标志位:终止FIN=1,意味着B要释放B—>A的TCP连接;序号seq=w,w值由B指定;确认号ack=u+1;此后B不再向A发送数据,但能接收数据。
第四次挥手:A收到B的连接释放报文段后,向B发出确认报文。
在确认报文的TCP首部中:标志位:确认ACK=1,表示收到B的确认报文,并同意B释放连接;序号seq=u+1;确认号ack=w+1;
由此通过四次挥手释放了TCP连接。
TCP传输连接管理的更多相关文章
- 运输层8——TCP运输连接管理
目录 1. TCP的连接建立 2. TCP的连接释放 写在前面:本文章是针对<计算机网络第七版>的学习笔记 运输层1--运输层协议概述 运输层2--用户数据报协议UDP 运输层3--传输控 ...
- 三报文握手 四报文握手 TCP运输连接管理
三报文握手 四报文握手 TCP运输连接管理
- 【TCP】连接管理
TCP连接管理 本节将介绍一条TCP连接是如何建立和拆除的.此处假设客户机A上面的一个进程想要和服务 器B上的一个进程建立一条TCP连接.本文前面介绍的是比较正常的连接和拆除,特殊的会在后面介绍. ...
- [TCP/IP] TCP的传输连接管理
1.连接建立=>数据传输=>连接释放 2.主动发起连接的是客户端,被动接受连接的是服务器 3.三次握手 客户端 ==> SYN是1同步 ,ACK确认标志是0,seq序号是x ==&g ...
- TCP的连接管理
创建连接:(三次握手) 第一步: 客户端向服务器发送一个报文,该报文不含有数据段,SYN=1,随机产生sequence number(随机产生可用于避免某些安全性攻击) 第二步: 服务器收到报文,为这 ...
- linux内核参数调优,缓冲区调整,tcp/udp连接管理,保持,释放优化,gossary,terms
changing a readonly file (linu single user mode)
- TCP连接管理(TCP Connection Management)
在最近的求职面试过程中,关于"建立TCP连接的三次握手"不止一次被问到了,虽然我以前用同样的问题面试过别人,但感觉还是不能给面试官一个很清晰的回答.本文算是对整个TCP连接管理做一 ...
- TCP系列02—连接管理—1、三次握手与四次挥手
一.TCP连接管理概述 正如我们在之前所说TCP是一个面向连接的通信协议,因此在进行数据传输前一般需要先建立连接(TFO除外),因此我们首先来介绍TCP的连接管理. 通常一次完整的TCP数据传输一般包 ...
- 前端学HTTP之连接管理
前面的话 HTTP连接是HTTP报文传输的关键通道.要掌握HTTP就需要理解HTTP连接的来龙去脉以及如何使用这些连接 如果想查看一个网页,浏览器收到URL时,会执行下图所示的步骤.将服务器的IP地址 ...
随机推荐
- 爬虫笔记(十一)——认识cookie
什么是cookie? 在爬虫的使用中,如果涉及登录等操作时,经常会使用到cookie.简单的来说,我们访问每一个互联网页面,都是通过HTTP协议进行的,而HTTP协议是一个无状态协议,所谓的无状态协议 ...
- ubuntu 更新源 或者 apt-get install 出错404 not found ,Failed to fetch
1.考虑是不是能上网 2.用apt-get update ,然后再试试apt-get install 如果apt-get update 也出现很多 404 not found 或者 failed to ...
- Getting Started with STM32 in Segger Embedded Studio
初识Segger Embedded Studio(SES) 第一次见SES是在“安富莱电子论坛”上,“硬汉”提到SES的一些特性,再加上Jlink的大名,于是试试他们家的IDE. SES貌似也是基于E ...
- iOS MJRefresh的使用 (列表上拉加载更多)
pod 'MJRefresh' import MJRefresh 加载更多 let footView = MJRefreshAutoNormalFooter(refreshingBlock:{ //去 ...
- Hibernate之Query.uniqueResult()结果为数值的注意事项
在日常练习中使用Query.uniqueResult()获取查询总数量,想当然的把返回结果值直接强转成Integer类型,实现运行报错,具体代码如下: 控制台错误信息如下: 返回值为Long型,使用时 ...
- 61)PHP,立即跳转
一般使用 header(‘Location:’)来进行跳转. ******************************************************************* ...
- linux下安装glibc-2.14,解决“`GLIBC_2.14' not found”问题
下载安装包:http://ftp.gnu.org/gnu/glibc/ 我下载的是glibc-2.14.1.tar.gz 解压:tar xzf glibc-2.14.1.tar.gz cd glibc ...
- python3多线程应用详解(第一卷:线程的本质概念)
之前我用过多线程的方式执行了爬虫程序,爬取了糗事百科的数据可以看到速率非常之快,就像正常一个人他要完一个汉堡,再吃喝一瓶水才能走,结果他边吃汉堡边喝水,速率一下加快了一样.首先我们看看什么是线程: 图 ...
- Kintinuous解析
版权声明:本文为博主原创文章,未经博主允许不得转载. Kintinuous是Thomas Whelan在National University of Ireland Maynooth读博期间的工作,有 ...
- spring xml 注入 map 时 map 标签报错
如图所示: 在XML配置文件中并没有问题,问题出在实体类,在类中属性 maps 用 Map定义即可,用HashMap定义就会出现如上错误 K-I-N-G-D-O-M