一、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三次握手,四次挥手的更多相关文章

  1. [转]Linux服务器上11种网络连接状态 和 TCP三次握手/四次挥手详解

    一.Linux服务器上11种网络连接状态: 图:TCP的状态机 通常情况下:一个正常的TCP连接,都会有三个阶段:1.TCP三次握手;2.数据传送;3.TCP四次挥手. 注:以下说明最好能结合”图:T ...

  2. 网络 TCP三次握手,四次挥手详解

    三次握手,四次挥手可以说是炙手可热的面试题了,来看看它究竟长什么样子吧! 我们先把流程图贴上来 : 为什么这么复杂? 因为TCP是可靠性传输. 确认可靠传输的前提:  TCP连接管理机制 用TCP首部 ...

  3. tcp三次握手四次挥手那些事

    建立TCP需要三次握手才能建立,而断开连接则需要四次挥手.三次握手,四次挥手流程图如下: 一.首先看下如何通过三次挥手----------建立连接 首先客户端发送连接请求报文,服务端接受连接后回复AC ...

  4. TCP三次握手四次挥手,通俗易懂版

    三次握手四次挥手 三次握手 其实很好理解,三次握手就是保证双手都有发送和接受的能力.那么最少三次才能验证完成 即----> 客户端发送---服务端收到----服务端发送-- 1.客户端发送 -- ...

  5. 网络编程之TCP三次握手与四次挥手、基于TCP协议的套接字编程

    目录 TCP三次握手和四次挥手 背景描述 常用的熟知端口号 TCP概述 TCP连接的建立(三次握手) TCP四次挥手 如果已建立连接,客户端突然断开,会怎么办呢? 基于TCP协议的套接字编程 什么是S ...

  6. 网络编程之TCP三次握手,四次断开

    目录 TCP三次握手 1:上图的名词解释 2:TCP三次握手过程 3:为什么不能改成两次握手? TCP三次握手 1:上图的名词解释 SYN:同步序号.它表示建立连接.TCP规定SYN=1时不能携带数据 ...

  7. TCP三次握手四次挥手详解

    转载 http://www.cnblogs.com/zmlctt/p/3690998.html 相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不需 ...

  8. wireshark抓包直观图解 TCP三次握手/四次挥手详解

    转http://www.seanyxie.com/category/linux/ 作者:seanyxie |   一. TCP/IP协议族 TCP/IP是一个协议族,通常分不同层次进行开发,每个层次负 ...

  9. TCP三次握手/四次挥手

    TCP 三次握手 TCP 连接是通过三次握手进行初始化的.三次握手的目的是同步连接双方的序列号和确认号并交换 TCP 窗口大小信息.以下步骤概述了通常情况下客户端计算机联系服务器计算机的过程: 1.  ...

  10. TCP三次握手四次挥手详解2

    相对应socket开发者,TCP创建过程和连接拆除过程是由TCP/IP协议栈自动创建的,因此开发者并不需要控制这个过程,但是对于理解TCP底层运作机制,相当有帮助 TCP三次握手 所谓三次握手,是指建 ...

随机推荐

  1. JS基础_质数练习的改进,提高程序执行效率

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. JS基础_打印99乘法表

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. JS基础_自增自减练习

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. c++ 使用 gsoap 调用 WebService 中文乱码

    c++ 使用 gsoap 调用  WebService 中文乱码   问题产生: 使用gsoap时,如果WebService服务端及客户调用端都使用 C++ , 再传递中文时不会存在乱码问题, 当客户 ...

  5. 解决npm安装node-sass太慢及编译错误问题

    环境: win7 node v8.11.1 npm v5.6.0 背景: 最近vue项目使用sass,所以需要sass-loader,sass-loader依赖node-sass,还需安装node-s ...

  6. 查看磁盘空间,Android各目录讲解

    dfFilesystem Size Used Free Blksize/dev 2.0G 116.0K 2.0G 4096----------包含了所有Linux系统中使用的外部设备/sys/fs/c ...

  7. Perl 认识简介

    Perl简介 Perl 是 Practical Extraction and Report Language 的缩写,可翻译为 "实用报表提取语言". Perl 是高级.通用.直译 ...

  8. 最贵的AMD 7nm显卡来了!这设计 够狂野

    ROG STRIX系列配备三个风扇(支持智能启停).多条热管.金属背板,厚度达2.5个插槽位,另有两个8针辅助供电,因此最大供电能力375W,必然会预先大幅超频,而且应该仍有手动超频空间,当然也少不了 ...

  9. 数据库——Oracle(1)

    1 Oracle数据库:ORACLE数据库系统是美国ORACLE(甲骨文)研发并提供的款关系型数据库管理系统,占据市场的主要的份额. 目前常用版本:Oracle9i,Oracle10g,Oracle1 ...

  10. php查找判断二维数组中是否含有某个值

    $arr = array( array('a', 'b'), array('c', 'd') ); in_array('a', $arr); // 此时返回的永远都是 false deep_in_ar ...