@ tcp/ip原理

1.1 tcp/ip三次握手

1.1.1 建立过程说明

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

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

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连接。

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

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

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

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 十一种状态集介绍

Status

Description

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

tcp/ip原理/三次握手/四次挥手的更多相关文章

  1. Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手)

    Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手) 一丶CS/BS 架构 C/S: 客户端/服务器    定义:       ...

  2. TCP/IP报文 三次握手 四次挥手

    1.TCP报文格式  TCP/IP协议的详细信息参看<TCP/IP协议详解>三卷本.下面是TCP报文格式图:图1 TCP报文格式  上图中有几个字段需要重点介绍下:  (1)序号:Seq序 ...

  3. TCP/IP,三次握手四次挥手,TCP/UDP , HTTP/HTTPS

    internet:通用名词,由多个计算机网络组成的网络,网络间的通信协议是任意的 Internet:专用名词,当前全球最大的开放计算机网络,采用TCP/IP协议族作为通信的规则.www万维网是广泛应用 ...

  4. TCP/IP的三次握手, 四次挥手

    三次握手: 1. X初始序号, SYN:   , 发送  将syn=1, X发送至client 2. 服务器发送 ACK(确认包)=1, SYN=1, 接受顺序号(acknowledge number ...

  5. python摸爬滚打之----tcp协议的三次握手四次挥手

    TCP协议的三次握手, 四次挥手 三次握手过程 1, 服务器时刻准备接受客户端进程的连接请求, 此时服务器就进入了LISTEN(监听)状态; 2, 客户端进程然后向服务器发出连接请求报文, 之后客户端 ...

  6. http协议tcp协议ip协议三次握手四次挥手,为什么三次握手,为什么四次挥手,sockete套接字理解

    1.1 TCP是什么? TCP是Tranfer Control Protocol的简称,TCP协议是一种面向连接的.可靠的.基于字节流的运输层通信协议.通过TCP协议传输,得到的是一个顺序的无差错的数 ...

  7. 通俗理解TCP/IP协议三次握手四次分手流程

    转自:https://blog.csdn.net/special23/article/details/54137298 三次握手流程 客户端发个请求“开门呐,我要进来”给服务器 服务器发个“进来吧,我 ...

  8. OSI七层协议&TCP协议(三次握手四次挥手)

    今日内容 python 基础回顾 软件开发架构 网络理论前戏 OSI 七层协议(五层) TCP协议 三次握手与四次挥手 UDP协议 内容详细 一.python 基础回顾 1.基本数据类型 整型 int ...

  9. 关于TCP传输的三次握手四次挥手策略

    简单小总结: 一般为了能够准确无误地把数据送达目标处,TCP协议采用了三次握手策略.用TCP协议把数据包送出去后,TCP不会对传送后的情况置之不理,它一定会向对方确认是否成功送达. 注:握手过程中使用 ...

随机推荐

  1. //*[starts-with(@class,'btn')][text()='差'] 正则定位元素

    starts-with?  //*[starts-with(@class,'btn')][text()='差']   意思找从头开始的这个class

  2. 认识socketserver

    1.服务端 # 如果socket起一个tcp服务,在同一个时间只能和一个客户端通信 # 如果socketserver起一个服务,在同一个时间就可以和多个客户端通信了 # socketserver # ...

  3. 一些 git 常用的命令

    1.本地命令 查看状态 -git status 添加文件 -git add . 提交文件 -git commit -m "(comment)" 查看历史key -git reflo ...

  4. Java8 方法引用和构造方法引用

    如果不熟悉Java8新特性的小伙伴,初次看到函数式接口写出的代码可能会是一种懵逼的状态,我是谁,我在哪,我可能学了假的Java,(・∀・(・∀・(・∀・*),但是语言都是在进步的,就好比面向对象的语言 ...

  5. 死磕以太坊源码分析之p2p节点发现

    死磕以太坊源码分析之p2p节点发现 在阅读节点发现源码之前必须要理解kadmilia算法,可以参考:KAD算法详解. 节点发现概述 节点发现,使本地节点得知其他节点的信息,进而加入到p2p网络中. 以 ...

  6. 一遍记住Java常用的八种排序算法

    1.直接插入排序 经常碰到这样一类排序问题:把新的数据插入到已经排好的数据列中. 将第一个数和第二个数排序,然后构成一个有序序列 将第三个数插入进去,构成一个新的有序序列. 对第四个数.第五个数--直 ...

  7. Codeforces375D Tree and Queries

    dsu on tree 题目链接 点我跳转 题目大意 给定一棵 \(n\) 个节点的树,根节点为 \(1\).每个节点上有一个颜色 \(c_i\) \(m\) 次询问. 每次询问给出 \(u\) \( ...

  8. [sql 注入] insert 报错注入与延时盲注

    insert注入的技巧在于如何在一个字段值内构造闭合. insert 报错注入 演示案例所用的表: MariaDB [mysql]> desc test; +--------+--------- ...

  9. 攻克solo第六课(大调音阶与真的爱你)

    在本期文章中,笔者将通过guitar pro7和大家分享大调音阶的知识. 不知道大家有没有试着使用my song book里面的谱子,反正笔者是觉得赚大了,并且找了囊括民谣.爵士到摇滚在内不同风格的谱 ...

  10. 在FL Studio中如何更好地为人声加上混响(进阶教程)

    为人声加上混响是我们在处理人声过程中必不可少的一步.然而,除了直接在人声混音轨道加上混响插件进行调节以外,这里还有更为细节的做法可以达到更好的效果. 步骤一:使用均衡器 在为人声加上混响之前,我们应该 ...