动手学习TCP:服务端状态变迁】的更多相关文章

上一篇文章中介绍了TCP连接的建立和终止. 通过实际操作了解到,在TCP协议工作过程中,客户端和服务端都会接收或者发送特定标志的TCP数据包,然后进入不同的状态. 也就是说,TCP协议就是一个包含多种状态转换的状态机,下面介绍一下TCP状态机. TCP状态机 网络上的传输是没有连接的,包括TCP也是一样的.TCP所谓的"连接",其实是在通讯的双方维护一个"连接状态",让它看上去好像有连接一样. 所以,了解TCP状态机,以及TCP的状态变迁是非常重要的. TCP 协议…
上一篇文章介绍了TCP状态机,并且通过实验了解了TCP客户端正常的状态变迁过程. 那么,本篇文章就一起看看TCP服务端的正常状态变迁过程 服务端状态变迁 根据上一篇文章中的TCP状态变迁图,可以得到服务器的正常状态变迁流程如下: CLOSED -> LISTEN -> SYN_RECV -> ESTABLISHED -> CLOSE_WAIT -> LAST_ACK -> CLOSED 具体的将状态跟TCP包关联起来就如下表示: From State To State…
TCP是一个十分复杂的协议,通过前面几篇文章只涉及了TCP协议中一些基本的概念. 虽然说都是一些TCP最基本的概念,但是试验过程中一直在踩坑,例如:TCP flag设置错误,seq.ack号没有计算正确,TCP状态变迁错误等等. 通过Pcap.Net真正实验一下才发现了很多TCP协议中要注意的细节,例如:Ack.Seq号的计算,EthernetLayer.IpV4Layer .TcpLayer的层层包装,不同TCP flags的含义等等. TCP中还有很多重要的内容,先做个记录,后面再深入了解.…
前面的文章介绍了TCP状态变迁,以及TCP状态变迁图中的一些特殊状态. 本文主要看看TCP数据传输过程中需要了解的一些重要点: MSS(Maximum Segment Size) Seq号和Ack号的计算 TCP半连接 TCP数据传输实验 在开始介绍上面列出的内容之前,先看看实验程序的运行. 本文的例子代码是基于"动手学习TCP:客户端状态变迁"文章中的例子. 首先,修改了"BuildTcpPacket"这个函数,增加了两个功能: 正常情况下TCP首部是20个字节,…
前面的文章介绍了TCP状态变迁,以及TCP状态变迁图中的一些特殊状态. 本文主要看看TCP数据传输过程中需要了解的一些重要点: MSS(Maximum Segment Size) Seq号和Ack号的计算 TCP半连接 TCP数据传输实验 在开始介绍上面列出的内容之前,先看看实验程序的运行. 本文的例子代码是基于"动手学习TCP:客户端状态变迁"文章中的例子. 首先,修改了"BuildTcpPacket"这个函数,增加了两个功能: 正常情况下TCP首部是20个字节,…
前面两篇文章介绍了TCP状态变迁,以及通过实验演示了客户端和服务端的正常状态变迁. 下面就来看看TCP状态变迁过程中的几个特殊状态. SYN_RCVD 在TCP连接建立的过程中,当服务端接收到[SYN]包后,就会发送[SYN, ACK]包,然后进入SYN_RCVD状态. 根据前面文章的介绍,服务器的上述行为被称为被动打开,并且会等待来自客户的的[ACK]包来完成TCP连接的建立.但是,如果此时客户端没有响应,服务端就会超时重传[SYN, ACK]包. 回想一下我们在"动手学习TCP: 环境搭建&…
前一段时间通过Wireshark抓包,定位了一个客户端和服务器之间数据传输的问题.最近就抽空看了看<TCP/IP详解 卷1>中关于TCP的部分,书中用了很多例子展示了TCP/IP协议中的一些基本概念. 所以,也准备自己动手,通过一些简单的实验来进一步了解一下TCP中的一些基本概念. 环境搭建和配置 在开始进行实验之前,首先看看实验环境的搭建: Wireshark:用来抓取网络上的包,可以清楚的看到TCP/IP协议层,以及每层的详细信息,通过此处下载 一台虚拟机:如果客户端和服务端都在本机,那么…
上一篇中介绍了TCP数据传输中涉及的一些基本知识点.本文让我们看看TCP中的4种定时器. TCP定时器 对于每个TCP连接,TCP管理4个不同的定时器,下面看看对4种定时器的简单介绍. 重传定时器使用于当希望收到另一端的确认. 该定时器是用来决定超时和重传的. 由于网络环境的易变性,该定时器时间长度肯定不是固定值:该定时器时间长度的设置依据是RTT(Round Trip Time),根据网络环境的变化,TCP会根据这些变化并相应地改变超时时间. 坚持定时器(persist)使窗口大小信息保持不断…
无聊研究Winsock套接字编程,用原生的C语言接口写出来的代码看着难受,于是自己简单用C++封装一下,把思路过程理清,方便自己后续翻看和新手学习. 只写好了TCP通信服务端,有空把客户端流程也封装一下. 先上主函数: // main.cpp : 异想家sandeepin poi! #include "stdafx.h" #include <iostream> extern int JTCPserver(); extern int JTCPclient(); int mai…
一.相关函数 1.  int select(int maxfdp, fd_set *readset, fd_set *writeset, fd_set *exceptset,struct timeval *timeout); int maxfdp: 该参数是指集合中所有文件描述符的范围, 即所有文件描述符的最大值加1: fd_set *readset: 该参数是我们所关心的文件是否可读的文件描述符的集合, 如果这个集合中有个文件可读了,那select返回一个大于0的数,表示有文件可读了 fd_s…