【网络基础】03、TCP传输连接的建立与释放

一、TCP的传输连接管理的三个阶段 

IP协议的作用范围:提供主机之间的逻辑通信

TCP和UDP协议的作用范围:提供进程之间的逻辑通信

TCP (Transmission Control Protocol)   传输控制协议

UDP (User Datagram Protocol )      用户数据报协议

当运输层采用面向连接的TCP协议时,尽管下面的网络是不可靠的(只提供尽最大努力服务),但这种逻辑通信信道就相当于一条全双工的可靠信道。

当运输层采用无连接的UDP协议时,这种逻辑通信信道是一条不可靠信道

1、TCP连接的建立都是采用客户端/服务器方式

主动发起连接建立的应用进程叫做客户端(client)。

被动等待连接建立的应用进程叫做服务器(server)。

传输连接就有三个阶段,即:连接建立、数据传送和连接释放。

传输连接的管理就是使传输连接的建立和释放都能正常地进行。

2、连接建立过程中要解决以下三个问题

要使每一方能够确知对方的存在

要允许双方协商一些参数(如最大报文段长度,最大窗口大小,服务质量等)。

能够对运输实体资源(如缓存大小,连接表中的项目等)进行分配。

3、TCP连接的状态转移

4、TCP的三次握手建立传输连接

TCP的状态 (SYN, FIN, ACK, PSH, RST, URG)

在TCP层,有个FLAGS字段,这个字段有以下几个标识:

SYN  synchronous     建立联机

ACK  acknowledgement  确认

PSH  push         传送

FIN  finish        结束

RST  reset         重置

URG  urgent        紧急

Sequence number      顺序号码

acknowledge number    确认号码

其中,对于我们日常的分析有用的就是前面的五个字段。

第一次握手:主机A向B发出连接请求报文段

其首部中发送位码为:同步位为SYN=1,并随机产生序号seq=x,表明传送数据时的第一个数据字节的序号是x;并进入SYN_SEND状态,等待服务器确认;

第二次握手:主机B收到连接请求报文段后(主机B由SYN=1知道,A要求建立联机),如同意,则发回确认;

B在确认报文段中应使SYN=1,ACK=1,其确认号ack=x+1,自己选择的序号seq=y的包;此时服务器进入SYN_RECV状态;

第三次握手:主机A收到此报文段后B给出确认,

B在确认报文段中使用ACK=1,确认号ack=y+1,序号为seq=x+1

A的TCP通知上层应用进程,连接已经建立

B的TCP收到主机A的确认后,也通知其上层应用进程;TCP连接已经建立

5、TCP的4次挥手释放传输连接

第一次挥手:数据传输结束后,通信的双方都可释放连接

现在A的应用进程先向其TCP发出连接释放报文段,并停止再发送数据,主动关闭 TCP连接。

A把连接释放报文段首部的FIN = 1,其序号seq = u,等待B的确认。

第二次挥手:B发出确认

确认报文段中,ACK=1,确认号ack = u +1,而这个报文段自己的序号 seq = v。

TCP服务器进程通知高层应用进程,从A到B这个方向的连接就释放了,TCP连接处于半关闭状态;

B若发送数据,A仍要接收。

第三次挥手:若B已经没有要向A发送的数据,其应用进程就通知TCP释放连接

在确认报文段中 FIN=1,ACK= 1,确认号ack=u +1,自己的序号seq=w;

第四次挥手: A收到连接释放报文段后,必须发出确认

在确认报文段中 ACK=1,确认号ack=w+1,自己的序号 seq =u+1。

二、面试中常问问题

1、为什么建立连接协议是三次握手,而关闭连接却是四次挥手呢?

这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的连接请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可能未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。

2、为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态? 

MSL 报文最大生存时间,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃

这是因为虽然双方都同意关闭连接了,而且挥手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到ESTABLISH状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文。

3、为什么不能用两次握手进行连接?

我们知道,3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。
  如果把三次握手改成仅需要两次握手,死锁是可能发生的。

作为例子,考虑计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发送了确认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S是否已准备好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。

时间: 2024-10-09 22:23:23

【网络基础】03、TCP传输连接的建立与释放的相关文章

tcp连接的建立与释放

1.TCP是面向连接的协议. 运输连接时用来传送TCP报文的.TCP运输连接的建立和释放是每一次面向连接的通信中必不可少的过程.因此,运输链接就有三个阶段,即:连接建立.数据传送和连接释放. 在TCP连接建立过程中要解决以下三个问题: (1)要能使每一方都确知对方的存在. (2)要允许双方协商一些参数(如最大窗口值.是否使用窗口扩大选项和时间戳选项以及服务质量等). (3)能够对运输实体资源(如缓存大小.连接表中的项目等)进行分配. 2.TCP的连接建立 上面给出的连接建立过程叫做三次握手 2.

计算机网络(11)-----TCP连接的建立和释放

TCP连接的建立和释放 概述 TCP运输连接的建立和释放是每一次面向连接的通信中必不可少的过程,运输连接有三个阶段:连接建立,数据传送和连接释放. TCP连接的建立 如图所示,假定A主机是客户端程序,B主机是服务端程序.最初两端的TCP进程都是出于CLOSED(关闭)状态. (1)B的TCP服务器进程先创建传输控制块TCB(transmission Control Block),准备接受客户进程的连接请求.然后服务器就进入LISTEN(监听)状态,等待客户端的连接请求. (2)A的TCP客户进程

【网络协议】TCP连接的建立和释放

转载请注明出处:http://blog.csdn.net/ns_code/article/details/29382883 TCP首部格式 先看TCP报文段的格式,例如以下; TCP报文段首部的前20个字节是固定的,后面有4N字节是依据须要而添加的选项.因此TCP报文段的最小长度为20个字节. 首部固定部分的各字段的意义例如以下: 1.源port和目的port:加上IP首部的源IP地址和目的IP地址,确定唯一的一个TCP连接.另外通过目的port来决定TCP将数据报交付于那个应用程序,从而实现T

【网络基础】 TCP & UDP 基础

TCP报文格式 source:发送TCP数据的源端口 dest:接受TCP数据的目的端口 seq:标识该TCP所包含的数据字节的开始序列号 ack_seq:确认序列号,表示接受方下一次接受的数据序列号. doff:数据首部长度.和IP协议一样,以4字节为单位.一般的时候为5 urg:如果设置紧急数据指针,则该位为1 ack:如果确认号正确,那么为1 psh:如果设置为1,那么接收方收到数据后,立即交给上一层程序 rst:为1的时候,表示请求重新连接 syn:为1的时候,表示请求建立连接 fin:

TCP/IP连接的建立

1.TCP连接的建立 设主机B运行一个服务器进程,它先发出一个被动打开命令,告诉它的TCP要准备接收客户进程的连续请求,然后服务进程就处于听的状态.不断检测是否有客户进程发起连续请求,如有,作出响应.设客户进程运行在主机A中,他先向自己的TCP发出主动打开的命令,表明要向某个IP地址的某个端口建立运输连接,过程如下: 1)主机A的TCP向主机B的TCP发出连接请求报文段,其首部中的同步比特SYN应置1,同时选择一个序号x,表明在后面传送数据时的第一个数据字节的序号是x. 2)主机B的TCP收到连

【Linux网络基础】TCP/IP协议簇的详细介绍(三次握手四次断开,11种状态)

一.TCP/IP协议簇(DoD参考模型) 用于简化OSI层次,以及相关的标准. 传输控制协议(tcp/ip)簇是相关国防部DoD所创建的,主要用来确保数据的完整性以及在毁灭性战争中维持通信 是由一组不同功能的协议组合在一起构成的协议簇 利用一组协议完成OSI所实现的功能 1. TCP/IP 协议簇中的相关协议 TCP/IP协议簇--应用层: TCP/IP协议簇--主机到主机层: TCP与UDP对比: TCP相关报文结构: 源端口:即本地发起连接的端口 目标端口:即要访问的服务的端口 序列号:因为

20150908 Linux运维网络基础和TCP有限状态机状态转换原理、Linux网络属性配置及网络

1.网络的O互联网模型 物理层:电信号.网卡.比特流,迷数据端设备提供传送数据 数据链路层:将源自网络层来的数据传输至相邻目标网络层中.IP报文. 网络层:负责为分组交换机上的不同主机提供通信服务,TCP/IP层    ( 是在Linux内核实现) 传输层:二个主机中进程间的通信提供服务,通过端口的形式(随机端口)是通信源头 应用层:直接为用户的应用提供服务 (在客户应用中实现)例如:http.tomcat OSI 数据传输格式 协议 会话.表示.应用层 报文 HTTP  FTP    SMTP

网络基础之TCP/IP协议

TCP/IP分层模型中,通信界定地址:    物理地址:在交换机中进行通信的,        以太网地址,MAC地址:        功能:真正的用于本地通信的地址:        使用范围:本地局域网内部且不跨路由设备: 逻辑地址:(IP地址)        在TCP/IP协议栈中,逻辑地址被定义为IP地址:        功能:界定主机到主机的通信地址:点到点通信:逻辑地址仅用于主机定位,不用于真正的通信:        使用范围:全球互联网: 逻辑端口号:(确定每个进程的标识符)     

TCP之连接的建立和终止

1. 连接的建立 TCP 连接建立的三次握手 如上图所示,TCP 连接的建立会发生如下述情形: 服务器必须准备好接受外来的连接.这通常通过调用 socket.bind 和 listen 这 3 个函数来完成,我们称之为被动打开(passive open). 客户通过调用 connect 发起主动打开(active open).这导致客户 TCP 发送一个 SYN(同步)分节,它告诉服务器客户端将在(待建立的)连接中发送的数据的初始序列号.通常 SYN 分节不携带数据,其所在的 IP 数据报只含有