三次握手与四次挥手大家都比较清楚,下面是TCP状态转移图

配和下面的图更加容易理解各个状态的变化:

socket的创建,它就是可读、可写、可控制、可关闭的文件描述符。

int socket(int domain,int type,int protocol);

domain参数告诉系统使用哪个底层协议族,type参数指定服务类型,protocol参数是在前两个参数构成的协议集合下,再选择一个具体的协议。socket系统调用成功时返回一个socket文件描述符。

socket的命名,也就是socket地址的绑定,使用bind函数:

            int bind(int sockfd,const struct sockaddr*my_addr,socklen_t  addrlen);
bind将my_addr所指的socket地址分配给未命名的sockfd文件描述 符,addrlen参数指出该socket地址的长度。在服务器程序中,我们通常要命名socket,因为只有命名后客户端才能知道该如何连接它。客户端则通常不需要命名socket,而是采用匿名方式,即使用操作系统自动分配的socket地址。
顺带提一下sockaddr,它是socket地址的结构体,下面是IPv4的专用结构体
struct sockaddr_in
{
        sa_family_t sin_family;/*地址族:AF_INET*/
        u_int16_t sin_port;/*端口号,要用网络字节序表示*/
        struct in_addr sin_addr;/*IPv4地址结构体*/也就是地址
};
所有专用socket地址类型的变量在实际使用时都需要转化为通用socket地址类型sockaddr(强制转换即可)。
首先,客户端必须进入监听状态,也就是调用listen函数
        int listen(int sockfd,int backlog);
sockfd参数指定被监听的socket。backlog参数提示内核监听队列的最大长度。好了我们监听完成,进入SYN_RCVD状态,等待链接请求。
int accept(int sockfd,struct sockaddr*addr,socklen_t*addrlen);
等待连接函数,sockfd参数是执行过listen系统调用的监听socket,addr参数用来获取被接受连接的远端socket地址,该socket地址的长度由addrlen参数指出。accept只是从监听队列中取出连接,而不论连接处于何种状态。被取出后与客户端建立连接,服务端的该套接字进入ESTABLISHED状态。
int connect(int sockfd,const struct sockaddr*serv_addr,socklen_t  addrlen);
客户端主动通过connect函数与服务端建立连接,sockfd参数由socket系统调用返回一个socket。serv_addr参数是服务器监听的socket地址,addrlen参数则指定这个地址的长度。连接成功则进入ESTABLISHED状态。
三次握手完成,客户端程序主动connect进入SYN_SEND状态发送请求,服务端开启监听进入SYN_RECV状态,这两个状态都十分短暂。客户端connect成功后进入连接建立状态,服务端也在收到响应报文后进入连接建立状态。
下面就是四次挥手了,对于socket直接close就是四次挥手,不过,close系统调用并非总是立即关闭一个连接,而是将fd的引用计数减1。只有当fd的引用计数为0时,才真正关闭连接。你想马上关闭就用shutdown函数
int shutdown(int sockfd,int howto);
sockfd参数是待关闭的socket,howto参数决定了shutdown的行为。shutdown能够分别关闭socket上的读(SHUT_RD)或写(SHUT_WR),或者都关闭(SHUT_RDWR)。而close在关闭连接时只能将socket上的读和写同时关闭。
都说到这了,再说一下这四次挥手吧。客户端主动关闭发出FIN报文进入FIN_WAIT1状态,服务端收到FIN后发出响应报文进入CLOSE_WAIT状态,再向客户端发出FIN报文进入LAST_WAIT。客户端收到第一个响应报文进入FIN_WAIT2状态,再收到服务端的分手消息并发出响应进入TIME_WAIT状态,2个最大传播消息服务端无消息就CLOSE,服务端收到最后的响应也CLOSE。

#include<WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
#include<iostream>
#include<Ws2Tcpip.h>
using namespace std;int main() {//版本使用WORD wVersion = MAKEWORD(2, 1);//打开网络kuWSADATA wSockMsg;WSAStartup(wVersion, &wSockMsg);//创建socketSOCKET socketserver = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//ipv4专用地址sockaddr_in si;si.sin_family = AF_INET;si.sin_port = htons(8888);inet_pton(AF_INET, "127.0.0.1", (void*)&si.sin_addr.S_un.S_addr);bind(socketserver, (struct sockaddr*)&si, sizeof(si));listen(socketserver, SOMAXCONN);sockaddr_in clientMsg;int nlen = sizeof(clientMsg);SOCKET socketClient = accept(socketserver, (sockaddr*)&clientMsg, &nlen);closesocket(socketClient);closesocket(socketserver);//清理网络库WSACleanup();return 0;}

Socket与TCP状态相关推荐

  1. 利用 socket 获取 tcp 包并解析的问题。

    服务器端代码如下:(Java Servlet 实现) protected void doPost(HttpServletRequest request, HttpServletResponse res ...

  2. Linux Kernel TCP/IP Stack — Socket Layer — TCP/UDP Socket 网络编程

    目录 文章目录 目录 TCP/UDP Socket 逻辑架构 创建 Socket 绑定 Socket 请求建立 Socket 连接 监听 Socket 接受请求 关闭连接 数据的发送和接收 send ...

  3. 【Unix 网络编程】TCP状态转换图详解

    TCP协议的三路握手和四次挥手.如下图所示,TCP通信过程包括三个步骤:建立TCP连接通道(三次握手).数据传输.断开TCP连接通道(四次挥手). 这里进一步探究TCP三路握手和四次挥手过程中的状态变 ...

  4. 大剑无锋之HTTP连接、Tcp三次握手四次挥手、Tcp状态

    Http请求: 总的来说: DNS解析 TCP连接 发送HTTP请求 服务器处理请求并返回HTTP报文 浏览器解析渲染页面 连接结束 [补充] 三次握手和四次挥手: 第一次握手:建立连接时,客户端发送 ...

  5. 网络编程知识预备(3) ——SOCKET、TCP、HTTP之间的区别与联系

    参考:SOCKET,TCP,HTTP之间的区别与联系 作者:丶PURSUING 发布时间: 2021-03-19 11:54:01 网址:https://blog.csdn.net/weixin_44 ...

  6. TCP三次握手、四次挥手、socket,tcp,http三者之间的区别和原理

    接着上一篇文章叙述: TCP/IP连接(在互联网的通信中,永远是客户端主动连接到服务端): 手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接.TCP协 ...

  7. linux网路编程之TCP状态转换及端口复用

    (1)TCP状态转换图 其中图中分为三种状态:实线代表的主动发起连接,虚线代表的被动发起连接,细实线代表的可以双向发起连接的状态. 主动发起连接方状态变化:1)主动发起连接的一方发送SYN标志位,进入 ...

  8. 网络基础4(TCP三次握手,四次握手,TCP流量控制,TCP状态转换 , TCP异常断开,设置TCP属性,端口复用)

    TCP协议 TCP通信时序 下图是一次TCP通讯的时序图.TCP连接建立断开.包含大家熟知的三次握手和四次握手. TCP通讯时序 在这个例子中,首先客户端主动发起连接.发送请求,然后服务器端响应请求, ...

  9. Linux记录-TCP状态以及(TIME_WAIT/CLOSE_WAIT)分析(转载)

    1.TCP握手定理 2.TCP状态 l  CLOSED:初始状态,表示TCP连接是"关闭着的"或"未打开的". l  LISTEN :表示服务器端的某个SOCK ...

最新文章

  1. 数据库模型设计——主键的设计
  2. [20150710]11G谓词推入问题2.txt
  3. Burpsuite中宏的使用
  4. php简单的mysql类_超简单php mysql数据库查询类
  5. 单元测试 问题描述_单元测试技巧:创建描述性测试
  6. 设树采用孩子兄弟表示法存放.用类c语言设计算法计算树的高度.,(数据结构课程设计分类题目.doc...
  7. 未能成功加载扩展程序_【JAVA虚拟机(JVM)精髓】09-几种不同的类加载器
  8. CToolBarCtrl工具栏设置总结(转)
  9. python查看继承方法(一分钟读懂)
  10. Delphi XE不生成__history目录
  11. 用VB实现自己的邮件“自己发”
  12. @Autowired注解位置、@Autowired与@Resource的区别与注入流程
  13. 按位与运算()和求余运算(%)的联系
  14. setoolkit制作简单钓鱼网站
  15. 方大九钢携手图扑软件:数字孪生智慧钢厂
  16. html5 3d场景设计,三维场景设计是什么_三维场景设计的介绍
  17. 从PROXMOX群集中安全删除节点
  18. 标梵互动智建中健健身整合营销方案
  19. 订阅新闻联播文字标题到邮箱
  20. 电脑连接电视html,电脑HDMI连接电视无信号的解决方法

热门文章

  1. 基于物体颜色的目标检测与跟踪
  2. java整合谷歌翻译
  3. 别把白内障拖成青光眼,不可逆的致盲眼病最可怕!
  4. ES6结构赋值,一篇就够
  5. 停招!MSRA,被曝停招国防七子及北邮学生!!
  6. QMediaPlayer多媒体播放操作事项
  7. 【Selenium】控制当前已经打开的 chrome浏览器窗口(高级版)
  8. #1001. 求梯形的面积
  9. 【经营智慧】004.做一个善于发挥自己才智的人
  10. 《R语言数据分析》期末试题