internetwork communication:通信基础

TCP\UDP都使用相同的网络层(IP),TCP向应用层提供与UDP完全不同的服务。TCP提供一种面向连接的、可靠的字节流服务。

面向连接:客户端和服务端使用TCP彼此交换数据。

《TCP/IP协议详解》http://www.52im.net/topic-tcpipvol1.html

TCP报文格式:

  1. 序号[Seq序号],占32位,

标识从TCP源端向目的端发送的字节流,发起方发送数据时,对此进行标记

  1. 确认序号[Ack序号]:占32位,

只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1

(3)标志位:6个

URG:紧急指针有效

ACK:确认序号有效

PSH:[接收方]将报文交给应用层

RST:重置连接

SYN:发起连接

FIN: 释放连接

 

TCP的3次握手与4次挥手过程

3次握手  Three-Way Handshake

建立TCP连接:总共法3个包确认连接建立

在socket编程中,由客户端执行connect触发

  1. 第一次:

Client: 1.标志位SYN置为1,

2随机产生一个值seq=J,并将数据包发给Server,

3 client进入SYN_SENT状态

Server:等待确认

  1. 第二次:

Client:等待确认

Server:1接收数据包,由标志位SYN=1知道Client请求建立连接

             2 将标志位SYN和ACK都置为1,ACK=J+1

3随机产生一个值seq=K,发送数据包

  4Server进入SYN_RCVD状态

  1. 第三次:

Client:  1接收确认,

             2 检查ack是否为J+1,  ACK是否为1,如果正确,将标志位ACK置为1,ack=K+1

             3 发送数据包

Server: 1检查ack是否为J+1,  ACK是否为1,如果正确,则建立连接成功

最后:Client和Server进入ESTABLISHED状态,完成三次握手,随后可以传输数据

 

SYN共计:

4次挥手 Four-Way Wavehand

终止TCP连接:断开一个TCP连接时,客户端和服务端总共发送4个包来确认连接。

Socket编程中,由客户端或服务端任一方执行close触发。

  1. 第一次:

Client:1发送FIN

         2进入FIN_WAIT_1状态

  1. 第二次:

Server:1发送ACK,

          2确认序号为受到序号+1,进入CLOSE_WAIT状态

  1. 第三次:

Server:1发送FIN

           2进入LAST_ACK状态

  1. 第四次:

Client:1收到FIN,进入TIME_WAIT状态

           2发送ACK,

Server:1确认序号为收到序号+1,进入CLOSED状态

 

为什么建立连接时三次握手,关闭连接却是四次挥手

这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。

TCP\UDP都使用相同的网络层(IP),TCP向应用层提供与UDP完全不同的服务。TCP提供一种面向连接的、可靠的字节流服务。

面向连接:客户端和服务端使用TCP彼此交换数据。

《TCP/IP协议详解》http://www.52im.net/topic-tcpipvol1.html

TCP报文格式:

  1. 序号[Seq序号],占32位,

标识从TCP源端向目的端发送的字节流,发起方发送数据时,对此进行标记

  1. 确认序号[Ack序号]:占32位,

只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1

(3)标志位:6个

URG:紧急指针有效

ACK:确认序号有效

PSH:[接收方]将报文交给应用层

RST:重置连接

SYN:发起连接

FIN: 释放连接

 

TCP的3次握手与4次挥手过程

3次握手  Three-Way Handshake

建立TCP连接:总共法3个包确认连接建立

在socket编程中,由客户端执行connect触发

  1. 第一次:

Client: 1.标志位SYN置为1,

2随机产生一个值seq=J,并将数据包发给Server,

3 client进入SYN_SENT状态

Server:等待确认

  1. 第二次:

Client:等待确认

Server:1接收数据包,由标志位SYN=1知道Client请求建立连接

             2 将标志位SYN和ACK都置为1,ACK=J+1

3随机产生一个值seq=K,发送数据包

  4Server进入SYN_RCVD状态

  1. 第三次:

Client:  1接收确认,

             2 检查ack是否为J+1,  ACK是否为1,如果正确,将标志位ACK置为1,ack=K+1

             3 发送数据包

Server: 1检查ack是否为J+1,  ACK是否为1,如果正确,则建立连接成功

最后:Client和Server进入ESTABLISHED状态,完成三次握手,随后可以传输数据

 

SYN共计:

 

4次挥手 Four-Way Wavehand

终止TCP连接:断开一个TCP连接时,客户端和服务端总共发送4个包来确认连接。

Socket编程中,由客户端或服务端任一方执行close触发。

  1. 第一次:

Client:1发送FIN

         2进入FIN_WAIT_1状态

  1. 第二次:

Server:1发送ACK,

          2确认序号为受到序号+1,进入CLOSE_WAIT状态

  1. 第三次:

Server:1发送FIN

           2进入LAST_ACK状态

  1. 第四次:

Client:1收到FIN,进入TIME_WAIT状态

           2发送ACK,

Server:1确认序号为收到序号+1,进入CLOSED状态

 

为什么建立连接时三次握手,关闭连接却是四次挥手

这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。

猜你喜欢

转载自blog.csdn.net/ddhmbbklyk2018/article/details/81568788