tcp/ip原理/三次握手/四次挥手

@ tcp/ip原理

1.1 tcp/ip三次握手

 

 

1.1.1 创建过程说明

a)   由主机A发送创建TCP链接的请求报文, 其中报文中包含seq序列号, 是由发送端随机生成的, 而且还将报文中SYN字段置为1, 表示须要创建TCP链接。html

b)   主机B会回复A发送的TCP链接请求报文, 其中包含seq序列号, 是由回复端随机生成的, 而且将回复报文的SYN字段置为1, 并且会产生ACK字段, ACK字段数值是在A发过来的seq序列号基础上加1进行回复,以便A收到信息时, 知晓本身的TCP创建请求已获得了验证。linux

c)   A端收到B端发送的TCP创建验证请求后, 会使本身的序列号加1表示, 而且再次回复ACK验证请求, 在B端发送过来的seq基础上加1, 进行回复。服务器

1.1.2 简述说明

  1. 在最开始, 客户端和服务器都处于CLOSED状态。
  2. 服务器会建立socket文件开始监听, 服务器状态处于LISTEN。
  3. 客户端向服务器发送SYN, 请求创建链接, 发完以后本身的状态变为SYN_SENT。
  4. 服务器收到客户端发来的SYN, 而后会回复ACK和SYN, 发完以后本身的状态变为SYN_RECV
  5. 客户端收到服务器发来的SYN和ACK以后会立刻回复ACK, 回复完以后状态变为ESTABLISHED。
  6. 服务器端收到客户端发来的ACK以后会直接进入ESTABLISHED

至此, 三次握手完成, 链接创建。并发

1.2 tcp/ip 四次挥手

 

 

 

1.2.1 断开过程说明

a)   主机A发送断开TCP链接请求的报文, 其中报文中包含seq序列号, 是由发送端随机生成的, 而且还将报文中FIN字段置为1, 表示须要断开TCP链接。socket

b)   主机B会回复A发送的TCP断开请求报文, 其中包含seq序列号, 是由回复端随机生成的, 并且会产生ACK字段, ACK字段数值, 是在A发过来的seq序列号基础上加1进行回复, 以便A收到信息时, 知晓本身的TCP断开请求已获得了验证。tcp

c)   主机B在回复完A的TCP断开请求后, 不会立刻就进行TCP链接的断开, 主机B会先确保断开前, 全部传输到A的数据是否已经传输完毕, 一旦确认传输数据完毕就会将回复报文的FIN字段置为1, 并产生随机seq序列号。函数

d)   主机A收到主机B的TCP断开请求后, 会回复主机B的断开请求, 包含随机生成的seq字段和ack字段, ack字段会在主机B的TCP断开请求的seq基础上加1, 从而完成主机B请求的验证回复。spa

 

1.2.2 简述说明

  1. 客户端发送一个FIN并进入FIN_WAIT_1状态, 并包括一个序号X。
  2. 服务端接收到客户端发送的FIN, 而后回复ACK确认号X+1和已方的序号Y给客户端, 此时服务端进入CLOSE_WAIT状态, 客户端收到服务端的ACK后, 进入FIN_WAIT_2状态。
  3. 服务端发送一个FIN给客户端, 包括ACK确认号X+1和已方的一个序号Y, 并进入LAST_ACK状态。
  4. 客户端收到服务端发送的FIN, 而后回复ACK确认号Y+1和已方的序号X+1给服务端, 此时客户端进入TIME_WAIT状态, 通过2MSL时间后关闭链接, 服务端收到客户端的ACK后, 关闭链接。

 

 

1.3 tcp/ip状态集

1.3.1 十一种状态集介绍

 

Statushtm

Descriptionblog

LISTEN

服务启动后首先处于侦听LISTENING状态

SYN_SENT

在发送链接请求后等待匹配的链接请求。经过connect()函数向服务器发出一个同步SYNC信号后进入此状态

SYN_RECEIVED

已经收到并发送同步SYNC信号以后等待确认ACK请求

ESTABLISHED

链接已经创建, 表示2台机器能够相互通讯, 此时链接两端是平等的

FIN_WAIT_1

主动关闭端调用close()函数发出FIN请求包, 表示本方的数据发送所有结束, 等待TCP链接另外一端的确认包或FIN请求包

FIN_WAIT_2

主动关闭端在FIN_WAIT_1状态下收到确认包, 进入等待远程TCP的链接终止请求的半关闭状态, 这时能够接收数据, 但再也不发送数据

CLOSE_WAIT

被动关闭端接到FIN后, 就发出ACK以回应FIN请求, 并进入等待本地用户的链接终止请求的半关闭状态, 这时能够发送数据, 但再也不接收数据

CLOSING

在发出FIN后, 又收到对方发来的FIN后, 进入等待对方对链接终止FIN的确认ACK的状态, 少见

LAST_ACK

被动关闭端所有数据发送完成以后, 向主动关闭端发送FIN, 进入等待确认包的状态

TIME_WAIT

主动关闭端接收到FIN后, 就发送ACK包, 等待足够时间(2倍MSL时间)以确保被动关闭端收到了终止请求的确认包

CLOSED

链接关闭, 表明双方无任何链接状态

 

 

参考连接:

http://www.4e00.com/blog/linux/2016/08/06/tcp-open-and-close.html

相关文章
相关标签/搜索