TCP\UDP都使用相同的网络层(IP),TCP向应用层提供与UDP完全不同的服务。TCP提供一种面向连接的、可靠的字节流服务。
面向连接:客户端和服务端使用TCP彼此交换数据。
《TCP/IP协议详解》http://www.52im.net/topic-tcpipvol1.html
TCP报文格式:
标识从TCP源端向目的端发送的字节流,发起方发送数据时,对此进行标记 |
只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1 |
(3)标志位:6个 URG:紧急指针有效 ACK:确认序号有效 PSH:[接收方]将报文交给应用层 RST:重置连接 SYN:发起连接 FIN: 释放连接 |
TCP的3次握手与4次挥手过程
3次握手 Three-Way Handshake |
建立TCP连接:总共法3个包确认连接建立 在socket编程中,由客户端执行connect触发
Client: 1.标志位SYN置为1, 2随机产生一个值seq=J,并将数据包发给Server, 3 client进入SYN_SENT状态 Server:等待确认
Client:等待确认 Server:1接收数据包,由标志位SYN=1知道Client请求建立连接 2 将标志位SYN和ACK都置为1,ACK=J+1 3随机产生一个值seq=K,发送数据包 4Server进入SYN_RCVD状态
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触发。
Client:1发送FIN 2进入FIN_WAIT_1状态
Server:1发送ACK, 2确认序号为受到序号+1,进入CLOSE_WAIT状态
Server:1发送FIN 2进入LAST_ACK状态
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报文格式:
标识从TCP源端向目的端发送的字节流,发起方发送数据时,对此进行标记 |
只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1 |
(3)标志位:6个 URG:紧急指针有效 ACK:确认序号有效 PSH:[接收方]将报文交给应用层 RST:重置连接 SYN:发起连接 FIN: 释放连接 |
TCP的3次握手与4次挥手过程
3次握手 Three-Way Handshake |
建立TCP连接:总共法3个包确认连接建立 在socket编程中,由客户端执行connect触发
Client: 1.标志位SYN置为1, 2随机产生一个值seq=J,并将数据包发给Server, 3 client进入SYN_SENT状态 Server:等待确认
Client:等待确认 Server:1接收数据包,由标志位SYN=1知道Client请求建立连接 2 将标志位SYN和ACK都置为1,ACK=J+1 3随机产生一个值seq=K,发送数据包 4Server进入SYN_RCVD状态
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触发。
Client:1发送FIN 2进入FIN_WAIT_1状态
Server:1发送ACK, 2确认序号为受到序号+1,进入CLOSE_WAIT状态
Server:1发送FIN 2进入LAST_ACK状态
Client:1收到FIN,进入TIME_WAIT状态 2发送ACK, Server:1确认序号为收到序号+1,进入CLOSED状态
|
为什么建立连接时三次握手,关闭连接却是四次挥手
这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。