TCP/IP 协议族,TCP握手协议传输协议

目录

一、TCP/IP 协议族

1、Http(HyperText Transfer Protocol) 超文本传输协议。

2、WWW(World Wide Web)万维网。

3、TCP/IP 协议族包含Http协议。

4、IP位于网络层。

5、TCP位于传输层,为字节流服务。

二、TCP 协议格式

(1)源端口、目的端口号

(2) 序号

(3)确认号

(4) 数据偏移

(5)控制位

(6) 窗口

(7)校验和

(8)紧急指针

(9)选项

三、TCP传输协议——三次握手

四、TCP释放连接——四次挥手

五、面试问题


一、协议族

 

1、TCP/IP

TCP/IP协议族是所有互联网相关的各类协议族的总称,共分为三层:

应用层:FTP文件传输协议(File Transfer Protocol)、DNS域名服务器(Domain Name System)、HTTP;

传输层:TCP传输控制协议(Transmission Control Protocol)、UDP用户数据报协议(User Datagram Protocol);

网络层:处理数据包、IP 互联网协议(Internet Protocol)。

2、WWW(World Wide Web)万维网

是Web浏览器用来浏览超文本的客户端应用程序的名词,简称Web。

3、Http(HyperText Transfer Protocol) 超文本传输协议。

Web通过使用Http协议作为规范完成从客户端到服务器端一系列运作的流程,属于应用层。

4、IP

作用是把各种数据包传递给对方。条件是IP地址(指明节点被分配到的地址,可变)和MAC地址(指网卡所属的固定地址,不可变),位于网络层。

5、TCP

位于传输层,为字节流服务。作用是大数据分割成段(segment);确保数据能到达目标:三次握手策略、Syn(synchronize)、ACK(acknowledgement)、FIN(Finish)。

 

二、TCP 协议格式

 TCP协议间交换的数据单元称为“TCP段”。它包括两部分,分别为首部数据。而首部标准长为20字节(bytes),携带选项的首部最长可达到60字节(bytes)。如下图所示

TCP/IP 协议族,TCP握手协议传输协议_第1张图片

(1)源端口、目的端口号

    各占2字节,端口号加上IP地址共同构成socket。互相通信的进程使用一对socket,包括协议、源IP、源端口、目的IP、目的端口,这五个元素唯一确定一个TCP连接。

(2) 序号

    占4字节,是TCP段所发送的数据部分第一个字节的序号。在TCP传送的数据流中,每一个字节都有一个序号。建立连接时,发送方将初始序号(Initial Sequence Number, ISN)填写到第一个发送的TCP段序号中。

(3)确认号

    占4字节,是期望收到对方下次发送的数据的第一个字节的序号,也就是期望收到的下一个TCP段的首部中的序号,等于已经成功收到的TCP段的最后一个字节序号加1。确认号在ACK标志为1时有意义,除了主动发起连接的第一个TCP段不设置ACK标志外,其后发送的TCP段都会设置ACK标志。

(4) 数据偏移

占4比特,表示数据开始的地方离TCP段的起始处有多远。实际上就是TCP段首部的长度。由于首部长度不固定,因此数据偏移字段是必要的。数据偏移以32位为长度单位,因此TCP首部的最大长度是60(15*4)个字节。

(5)控制位

    一共6个,占6比特,设置为1时有效。按顺序依次为:URG、ACK、PSH、RST、SYN、FIN

URG

紧急位,为1时,首部中的紧急指针有效

ACK

确认位,为1时,首部中的确认号有效

PSH

推位,为1时,要求把数据尽快交给应用程序

RST

复位标志,为1时,复位连接,一般在出错或关闭连接时使用

SYN

同步位,在建立连接时使用,当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,在发回的报文段中使SYN=1和ACK=1

FIN

结束位,为1时,表示发送方完成了数据发送

 

(6) 窗口

    占2字节,表示报文段发送方期望接收的字节数,可接收的序号范围是从接收方的确认号开始到确认号加上窗口大小之间的数据。

(7)校验和

    校验和包含了伪首部、TCP首部和数据,校验和是TCP强制要求的,由发送方计算,接收方验证。

(8)紧急指针

    URG标志为1时,紧急指针有效,表示数据需要优先处理。紧急指针指出在TCP段中的紧急数据的最后一个字节的序号,使接收方可以知道紧急数据共有多长。

(9)选项

    最常用的选项是最大段大小(Maximum Segment Size,MSS),向对方通知本机可以接收的最大TCP段长度。MSS选项只在建立连接的请求中发送。

 

三、TCP传输协议——三次握手

在 TCP/IP 协议中,TCP 协议提供可靠的连接服务,采用三次握手建立一个连接。

三次握手(three times handshake;three-way handshake)所谓的“三次握手”即对每次发送的数据量是怎样跟踪进行协商使数据段的发送和接收同步,根据所接收到的数据量而确定的数据确认数及数据发送、接收完毕后何时撤消联系,并建立虚连接。为了提供可靠的传送,TCP在发送新的数据之前,以特定的顺序将数据包的序号,并需要这些包传送给目标机之后的确认消息。TCP总是用来发送大批量的数据。当应用程序在收到数据后要做出确认时也要用到TCP。

TCP/IP 协议族,TCP握手协议传输协议_第2张图片

 

第一次握手:建立连接时,客户端发送 syn 包(tcp协议中syn位置1,序号为J)到服务器,并进入 SYN_SEND 状态,等待服务器确认; 

第二次握手:服务器收到 syn 包,必须确认客户的 SYN,同时自己也发送一个 SYN 包,即 SYN+ACK包(tcp协议中syn位置1,ack位置1,序号K,确定序号为J+1),此时服务器进入 SYN_RECV 状态; 

第三次握手:客户端收到服务器的 SYN+ACK 包,向服务器发送确认包 ACK(tcp协议中ack位置1,确认序号K+1),此包发送完毕,客户端和服务器进入ESTABLISHED(established连接成功) 状态,完成三次握手客户端与服务器开始传送数据。

 

 

四、TCP释放连接——四次挥手

     由于 TCP 连接是全双工的,因此每个方向都必须单独进行关闭。这好比,我们打电话(全双工),正常的情况下(出于礼貌),通话的双方都要说再见后才能挂电话,保证通信双方都把话说完了才挂电话。

TCP/IP 协议族,TCP握手协议传输协议_第3张图片

那TCP 的四次握手,是为了保证通信双方都关闭了连接,具体过程如下:

TCP/IP 协议族,TCP握手协议传输协议_第4张图片

第一步,当主机A的应用程序通知TCP数据已经发送完毕时,TCP向主机B发送一个带有FIN附加标记的报文段(FIN表示英文finish)。

第二步,主机B收到这个FIN报文段之后,并不立即用FIN报文段回复主机A,而是先向主机A发送一个确认序号ACK,同时通知自己相应的应用程序:对方要求关闭连接(先发送ACK的目的是为了防止在这段时间内,对方重传FIN报文段)。

第三步,主机B的应用程序告诉TCP:我要彻底的关闭连接,TCP向主机A送一个FIN报文段。

第四步,主机A收到这个FIN报文段后,向主机B发送一个ACK表示连接彻底释放。

 

 

五、面试问题

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

 

    这是因为服务端的 LISTEN 状态下的 SOCKET 当收到 SYN 报文的建连请求后,它可以把 ACK 和 SYN(ACK 起应答作用,而 SYN 起同步作用)放在一个报文里来发送。但关闭连接时,当收到FIN 报文通知时,如果能将ACK、FIN放在一个报文里那么就有了三次挥手,但是这是不可能,因为ACK是服务器B一收到FIN报文底层就回发的,而服务器B的FIN是应用层调用close()激发的,所以它这里的 ACK 报文和 FIN 报文在发送的时间上都是分开的,不可能同时发送。

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

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

 

你可能感兴趣的:(Web,Android,UI\HTTP框架,开发者技术基础)