@ 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. 支持jewel版本的calamari

    之前测试了下,发现calamari不支持jewel版本的,是因为接口了有了一些变化,在提出这个问题后,作者给出了回答,说肯定会支持的,并且做了一点小的改动,就可以支持了,这个作者merge了到了git ...

  2. nginx配置代理缓存

    nginx可以实现反向代理的配置,并且可以使用缓存来加速,本文是简单的实现功能的配置,暂时没有做其他的优化的部分的配置,从网上的资料来看,很多配置都是没有讲哪些是必须配置的,我自己在配置过程中就发现没 ...

  3. linux服务器远程网络开机(wake on lan)

    通过网络可以远程开关机,某些时候比较方便管理机器 检查服务器是否支持远程网络开机 [root@lab5101 ~]# ethtool eth0 Settings for eth0: Supported ...

  4. springboot同一项目部署多实例

    添加 -Dserver.port=xxxx 将配置文件放在nacos注册中心时,要记得在启动第二个实例记得把原来端口注释掉,如果配置文件在本地就不必注释掉了

  5. 其实SQL优化调优,就跟吃饭喝水一样简单,教你抓住SQL的本质!

    前言 SOL 优化并不简单,做好 SOL 优化需要掌握数据库体系结构.表和索引设计.高效 SOL法.高级 SOL 语法.多种优化工具等知识,甚至还得分析业务特点,以及了解优化器的缺点.只有建立 SOL ...

  6. FL studio系列教程(十四):如何在FL Studio播放列表中排列样式

    我们在FL Studio中做好了节奏样式后就可以在播放列表窗口中进行乐曲的编排了.刚接触这款软件的同学肯定会对如何编排比较陌生但也比较憧憬的,因为它是从一个窗口到另一个窗口中的操作.其实明白了这里的知 ...

  7. ios开发中如何调用苹果自带地图导航

    前段时间一直在赶项目,在外包公司工作就是命苦,天天加班不说,工作都是和工期合同挂钩的,稍微逾期就有可能被扣奖金,不谈这些伤脑筋的事情了,让我们说说iOS开发中如何调用苹果手机自带的地图. 学习如逆水行 ...

  8. Pyetst的四种setup和testdown

    1 1.setup_module和 teardown_module #在整个测试用例所在的文件中所有的方法运行前和运行后运行,只会运行一次 2.setup_class和 teardown_class ...

  9. [oBIX包使用教程] 使用 Python 通过 oBIX 协议访问 Niagara 数据

    oBIX 全称是 Open Building Information Exchange,它是基于 RESTful Web Service 的接口的标准,用于构建控制系统.oBIX是在专为楼宇自动化设计 ...

  10. HashMap稍微详细的理解

    此文章用来记录hashmap的一些特点(在学习中的所了解的,如有不足,请指正) 什么是hash表 概念 先来一段百度百科的的解释 散列表(Hash table,也叫哈希表),是根据关键码值(Key v ...