Linux网络编程一、tcp三次握手,四次挥手
一、TCP报文格式
(图片来源网络)
SYN:请求建立连接标志位
ACK:应答标志位
FIN:断开连接标志位
二、三次握手,数据传输,四次挥手
(流程图,图片来源于网络)
(tcp状态转换图,图片来源于网络)
1、客户端向处于监听状态(LISTEN)的服务端发送请求连接的报文。此时,报文中SYN标志位为1(表明其为请求建立连接的报文),同时还会随机生成一个32位的随机序号(图中1000),请求连接的报文可以可以携带数据(图中(0)表明没有携带数据)。客户端变为SYN_SENT状态。
2、服务器接受到客户端发来的连接请求。服务器检测SYN是否为1,如果是,服务器发送发送报文,并发起一个连接请求。报文中ACK标志位为1,SYN为1(向客户端发起连接请求),同时还会随机生成一个32位的随机序号(图中为8000)和32位的确认序号(图中为1001,1001=客户端请求连接的随机序号1000+SYN标志位为1+数据大小为0),32位的确认序号和ACK标志位为1共同表明收到了客户端的连接请求。服务端由LISTEN状态变为SYN_RCVD。
3、客户端接收到服务端发来的报文。客户端检测ACK标志位是否为1,并且校验32位的确认序号是否正确。如果是,客户端向服务端发送确认报文。客户端由SYN_SENT状态变为ESTABLISHED状态。服务端接收到客户端发来的确认报文,检测ACK标志位是否为1,并且校验32位的确认序号是否正确。如果是,服务端由SYN_RCVD状态变为ESTABLISHED状态。至此完成三次握手。
4、客户端向服务端发送数据(图中数据大小为20)。报文中32的序号为对方最后发送 ACK的时候携带的确认序号,此时报文中ACK标志位为1,32位的确认序号为第三次握手时向服务端发送的确认序号。
5、服务端接收到客户端发来的数据。校验数据编号、ACK标志位和32位确认序号后。服务端向客户端发送数据(图中大小为10)。
6、客户端接收到来自服务端的数据,校验无误后,如果有数据发送则重复4,如果没有则只向服务端发送确认报文。至此完成数据传输。
7、客户端向服务端发送断开连接的请求,报文中FIN标志位为1(表明为请求断开连接的报文)。32序号、ACK、确认序号同前所述。客户端状态变为FIN_WAIT_1。
8、服务端接收到客户端断开连接的请求(服务端状态变为CLOSE_WAIT),服务端发送确认报文。客户端接收到后状态变为FIN_WAIT_2。至此客户端断开了与服务端的连接,服务端没有断开和客户端的连接。此时服务端和客户端处于半关闭状态,即服务端可以向客户端发送数据(没有断开连接),客户端不可以向服务端发送数据(断开了连接)。
9、服务端向客户端发送断开连接的请求(服务端状态变为LAST_ACK),客户端接收后状态变为TIME_WAIT。
10、客户端向服务端发送确认报文。至此服务端断开了与客户端的连接,四次挥手完成,双方断开连接。
Linux网络编程一、tcp三次握手,四次挥手的更多相关文章
- [转]Linux服务器上11种网络连接状态 和 TCP三次握手/四次挥手详解
一.Linux服务器上11种网络连接状态: 图:TCP的状态机 通常情况下:一个正常的TCP连接,都会有三个阶段:1.TCP三次握手;2.数据传送;3.TCP四次挥手. 注:以下说明最好能结合”图:T ...
- 网络 TCP三次握手,四次挥手详解
三次握手,四次挥手可以说是炙手可热的面试题了,来看看它究竟长什么样子吧! 我们先把流程图贴上来 : 为什么这么复杂? 因为TCP是可靠性传输. 确认可靠传输的前提: TCP连接管理机制 用TCP首部 ...
- tcp三次握手四次挥手那些事
建立TCP需要三次握手才能建立,而断开连接则需要四次挥手.三次握手,四次挥手流程图如下: 一.首先看下如何通过三次挥手----------建立连接 首先客户端发送连接请求报文,服务端接受连接后回复AC ...
- TCP三次握手四次挥手,通俗易懂版
三次握手四次挥手 三次握手 其实很好理解,三次握手就是保证双手都有发送和接受的能力.那么最少三次才能验证完成 即----> 客户端发送---服务端收到----服务端发送-- 1.客户端发送 -- ...
- 网络编程之TCP三次握手与四次挥手、基于TCP协议的套接字编程
目录 TCP三次握手和四次挥手 背景描述 常用的熟知端口号 TCP概述 TCP连接的建立(三次握手) TCP四次挥手 如果已建立连接,客户端突然断开,会怎么办呢? 基于TCP协议的套接字编程 什么是S ...
- 网络编程之TCP三次握手,四次断开
目录 TCP三次握手 1:上图的名词解释 2:TCP三次握手过程 3:为什么不能改成两次握手? TCP三次握手 1:上图的名词解释 SYN:同步序号.它表示建立连接.TCP规定SYN=1时不能携带数据 ...
- TCP三次握手四次挥手详解
转载 http://www.cnblogs.com/zmlctt/p/3690998.html 相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不需 ...
- wireshark抓包直观图解 TCP三次握手/四次挥手详解
转http://www.seanyxie.com/category/linux/ 作者:seanyxie | 一. TCP/IP协议族 TCP/IP是一个协议族,通常分不同层次进行开发,每个层次负 ...
- TCP三次握手/四次挥手
TCP 三次握手 TCP 连接是通过三次握手进行初始化的.三次握手的目的是同步连接双方的序列号和确认号并交换 TCP 窗口大小信息.以下步骤概述了通常情况下客户端计算机联系服务器计算机的过程: 1. ...
- TCP三次握手四次挥手详解2
相对应socket开发者,TCP创建过程和连接拆除过程是由TCP/IP协议栈自动创建的,因此开发者并不需要控制这个过程,但是对于理解TCP底层运作机制,相当有帮助 TCP三次握手 所谓三次握手,是指建 ...
随机推荐
- 动画方案 Lottie 学习(一)之基础
参考 lottie系列文章(一):lottie介绍 lottie系列文章(二):lottie最佳实践 lottie系列文章(三):动画设计规范 lottie系列文章(四):源码分析——svg渲染
- PS 中混合模式
1.正常模式 2. 溶解 3. 变暗 : 把两幅图中较暗的区域显示出来 4.正片叠底 总体变暗,把图层中较浅的颜色由下一图层较深的颜色显现(和滤色相反) 7. 深色 取较小的颜色 8. ...
- python3爬虫图片验证码识别
# 图片验证码识别 环境安装# sudo apt-get install -y tesseract-ocr libtesseract-dev libleptonica-dev# pip install ...
- Flutter 之页面状态保持
一般情况下,我们使用tab切换的时候希望操作完毕之后,能够记住上个页面的状态, 但是使用Flutter的BottomNavigationBar的 时候默认是不记录页面状态的,即切换页面会导致重新加载. ...
- linux(centos7) 查看磁盘空间大小
命令: df -hl 1 显示: 文件系统 容量 已用 可用 已用% 挂载点 Filesystem Size Used Avail Use% Mounted on /dev/hda2 45G 19G ...
- STM32 stm32fxxx_flash.icf文件的作用详解
文章转载自:https://blog.csdn.net/weibo1230123/article/details/80142210 每个芯片开发商都会针对每款芯片来编写一个.icf文件就是传说中的链接 ...
- Yii2常用操作
获取添加或修改成功之后的数据id $insert_id = $UserModel->attributes['id']; 执行原生sql $list = Yii::$app->db-> ...
- Scala(二)——基础语法(与Java的区分)和函数式编程
Scala快速入门(二) 一.键盘输入 关于基本类型的运算,以及复制运算,条件运算,运算符等知识,均和Java语言一样,这里不过多叙述. val name = StdIn.readLine() Std ...
- dubbo框架-学习-dubbo原理
博客:Dubbo原理和源码解析之服务暴露 博客:dubbo实现原理简单介绍
- 【两种方式】vuex 如何监听页面状态的变化
由于 Vuex 的状态存储本来就是响应式的,从 store 实例中读取状态最简单的方法,就是在计算属性中返回某个状态. 在 B 页面引入以下代码: computed: { myValue() { re ...