TCP 三次握手

作用:建立TCP连接

1.三次握手是客户端先发起请求到服务器,此时服务器处于LISTEN监听状态,A会先发送一个连接请求的报文---SYN=1,ACK=0,seq=x ,这个包也称为SYN包,当客户端发送完SYN包后,就进入SYN-SENT状态。

2.服务器B收到报文后,如果确认要与A建立TCP连接,要回复一个ACK包---SYN=1,ACK=1,ack=x+1,seq=y(注意这里的ack和ACK,大写的ACK表示的是占用一个比特位的ACK设置位,小写的ack是确认号)。服务端B将ACK包发送完后,进入SYN-RECV状态

3.客户端A收到后,解析B发来的ACK包,会给B回复---SYN=0,ACK=1,seq=x+1,ack=y+1。客户端A发送完后就进入了ESTABLISHED状态,表示A端已建立连接。
4.服务器B收到包后也进入ESTABLISHED状态。
TCP连接就建立完成

TCP 四次挥手

作用:断开TCP连接

断开连接有可能是A提出来,也有可能是B提出来的。当前客户端和服务器都处于ESTABLISHED建立状态

1.假设是客户端A先提出,A会给服务器先发一个FIN包---FIN=0,seq=u。发完后客户端A将转变为FIN-WAIT-1状态等待B的确认
2.服务器B收到后,看到报文中FIN=1,知道是A”想分手“,B一想分就分呗,就给A回了个报文---ACK=1,seq=v,ack=u+1。发完后就进入了CLOSE-WAIT关闭等待状态。

3.A收到后,又进入FIN-WAIT-2,等待服务器B给他发FIN=1的报文。
4.服务器B这时可能还有没给客户端A发送完的数据,当他确认发送完后,它会发送一个FIN+ACK包---FIN=1,ACK=1,seq=w,ack=u+1。
而后自动进入LAST-ACK状态。

5.客户端A收到B发来的FIN包后,还需要对服务器B做个回应的报文---ACK=1,seq=u+1,ack=w+1。当发送完这个包后,A不会立即进入关闭状态,他要等待可能因为网络或其他因素导致服务器B端发的数据包,为了不遗漏数据客户端A将等待2倍的MSL时长,之后才关闭。

6.服务器B收到A的回复后这才算真正的确认关闭连接了。

有没有感觉挥手(分手)好麻烦,那就像现实中的分手,总要搞清每一步 咳咳咳咳咳咳

TCP包头 (图中用到的)

ack:确认号
seq=包的序号(注意这个数字是相对的)
ACK:表示是否前面确认号字段是否有效。只有当ACK=1时,前面的确认号字段才有效。TCP规定,连接建立后,ACK必须为1,带ACK标志的TCP报文段称为确认报文段。

SYN:在建立连接时使用,用来同步序号。当SYN=1,ACK=0时,表示这是一个请求建立连接的报文段;当SYN=1,ACK=1时,表示对方同意建立连接。SYN=1,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中SYN才置为1,带SYN标志的TCP报文段称为同步报文段

FIN:表示通知对方本端要关闭连接了,标记数据是否发送完毕。如果FIN=1,即告诉对方:
“我的数据已经发送完毕,你可以释放连接了”,带FIN标志的TCP报文段称为结束报文段

每个状态的含义

CLOSED 没有任何连接状态
LISTEN 侦听状态,等待来自远方TCP端口的连接请求
SYN-SENT 在发送连接请求后,等待对方确认
SYN-RECEIVED 在收到和发送一个连接请求后,等待对方确认
ESTABLISHED 代表传输连接建立,双方进入数据传送状态
FIN-WAIT-1 主动关闭,主机已发送关闭连接请求,等待对方确认
FIN-WAIT-2 主动关闭,主机已收到对方关闭传输连接确认,等待对方发送关闭
传输连接请求
IME-WAIT 完成双向传输连接关闭,等待所有分组消失
CLOSE-WAIT 被动关闭,收到对方发来的关闭连接请求,并已确认
LAST-ACK 被动关闭,等待最后一个关闭传输连接确认,并等待所有分组消失
CLOSING 双方同时尝试关闭传输连接,等待对方确认

最新文章

  1. 忠告初学者学习Linux系统的8点建议
  2. Windows Store App 全球化:在后台代码中引用字符串资源
  3. FindBugs工具常见问题
  4. HDU 1394 & ZOJ 1484 Minimum Inversion Number
  5. Python迁移MySQL数据到MongoDB脚本
  6. C# 中的弱引用 WeakReference
  7. AFNetworking 2.0 获取json数据时,返回 NSLocalizedDescription=Request failed: unacceptable content-type: text/html, 解决方法.
  8. (hdu)1042 N! 大数相乘
  9. asp.net页面压缩
  10. 学习java的视频资源(尚学堂)(比较老旧,但是还是挺好用)
  11. 让老板虎躯一震的前端技术,KPI杀手
  12. Django 自定义过滤器
  13. Java笔记(二)类
  14. 离屏Canvas — 使用Web Worker提高你的Canvas运行速度
  15. 纯css实现
  16. MP实战系列(十一)之封装方法详解(续一)
  17. iOS protocbuf安装使用
  18. Codeforces Round #260 (Div. 2) B. Fedya and Maths
  19. 第128天:less简单入门
  20. rails scaffold生成的crud显示自定义的列名

热门文章

  1. redis db0-15 的概念
  2. PAT A1042 Shuffling Machine
  3. 虚拟机(Vmware)安装ubuntu18.04和配置调整(二)
  4. 老贾的第二天(git常用命令)
  5. 【Python基础】03_Python中的命名和关键字
  6. SAP日志表CDHDR 和
  7. 小程序API接口调用
  8. OSCP-FristiLeaks
  9. 正确理解这四个重要且容易混乱的知识点:异步,同步,阻塞,非阻塞,5种IO模型
  10. ubuntu16.04环境LNMP实现PHP5.6和PHP7.2