简述TCP/IP建立连接过程(附流程和代码)

这篇具有很好参考价值的文章主要介绍了简述TCP/IP建立连接过程(附流程和代码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:

TCP/IP 定义了计算机操作系统如何连入互联网,以及数据传输的标准。
TCP和IP是属于不同协议栈层的,只是这两个协议属于协议族里最重要的协议,所以协议栈或者模型以之命名了。

本段转载C语言中文网:TCP/IP 不是指一个协议,也不是 TCP 和 IP 这两个协议的合称,而是一个协议族,包括多个网络协议,比如 IP、ICMP(Internet Control Message Protocol,互联网控制报文协议)、TCP、HTTP(Hyper Text Transfer Protocol,超文本传输协议)、FTP(File Transfer Protocol,文件传输协议)、POP3(Post Office Protocol version 3,邮局协议)等。

正文:TCP/IP模型的连接过程:实质就是TCP通信的连接。

TCP(即传输控制协议)是一种面向连接传输层协议,提供可靠的连接服务

  • tcp通信:采用三次握手建立连接:

简述TCP/IP建立连接过程(附流程和代码)

三次握手:为了对每次发送的数据量进行跟踪与协商,确保数据段的发送和接收同步,根据所接收到的数据量而确认数据发送、接收完毕后何时撤消联系,并建立虚连接。

服务器必须准备好接受外来的连接。这通过调用socket、 bind和listen函数来完成,称为被动打开(passive open)。

第一次握手:客户通过调用connect进行主动打开(active open)。这引起客户TCP发送一个SYN(表示同步)分节(SYN=J),它告诉服务器客户将在连接中发送到数据的初始序列号。并进入SYN_SEND状态,等待服务器的确认。//类似客户主动给公司打电话,公司这边手机响铃并显示来电号码(以便公司确认是不是自己的客户的电话号;

第二次握手:服务器必须确认客户的SYN,同时自己也得发送一个SYN分节,它含有服务器将在同一连接中发送的数据的初始序列号。服务器以单个字节向客户发送SYN和对客户SYN的ACK(表示确认),此时服务器进入SYN_RECV状态。//公司确定是自己的客户的号码就接通这个电话号,并回应客户那边一声你好啊袁总;

第三次握手:客户收到服务器的SYN+ACK。向服务器发送确认分节,此分节发送完毕,客户服务器进入ESTABLISHED状态,完成三次握手。//客户收到公司的问候,回应你好啊王总,此刻可以两边都确定接通电话了,才能开始聊正事了;文章来源地址https://www.toymoban.com/news/detail-445038.html

TCP通信 编程流程(代码实现在最下方)

简述TCP/IP建立连接过程(附流程和代码)
简述TCP/IP建立连接过程(附流程和代码)
简述TCP/IP建立连接过程(附流程和代码)

  • 服务器端tcp通信 代码实现:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char const *argv[])
{
    if(argc != 3)
    {
        printf("please input %s <ip> <port>\n",argv[0]);
        return -1;
    }
    //1.创建套接字 socket
    int sockfd,acceptfd;
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0)
    {
        perror("socket err.");
        return -1;
    }
    printf("socket ok %d\n", sockfd);

    //填充ipv4的通信结构体
    struct sockaddr_in serveraddr;
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(atoi(argv[2]));
    serveraddr.sin_addr.s_addr = inet_addr(argv[1]);

    //&serveraddr -->struct sockaddr_in *

    //2.绑定套接字  bind  (绑定自己的ip和端口,便于别人找到自己)
    if (bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0)
    {
        perror("bind err.");
        return -1;
    }
    printf("bind ok.\n");

    //3.listen  监听 将主动套接子变为被动等待
    if (listen(sockfd, 5) < 0)
    {
        perror("listen err.");
        return -1;
    }
    printf("listen ok.\n");

    //4.阻塞等待客户端链接,链接成功返回一个通信文件描述符 accept 
   acceptfd=accept(sockfd,NULL,NULL);

   if(acceptfd < 0)
   {
       perror("accept err.");
       return -1;
   }
   printf("accept ok.\n");
   
   //5.循环收发消息
   char buf[128];
   int recvbyte;
   while(1)
   {
       //接收消息
       recvbyte=recv(acceptfd,buf,sizeof(buf),0);
       if(recvbyte < 0)
       {
           perror("recv err.");
           return  -1;
       }else if(recvbyte == 0)
       {
           printf("client exit.\n");
           break;
       }else 
       {
           printf("buf:%s\n",buf);
       }
   }
   close(acceptfd);
   close(sockfd);
    return 0;
}

  • 客户端tcp通信 代码实现
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char const *argv[])
{
    if(argc != 3)
    {
        printf("please input %s <ip> <port>\n",argv[0]);
        return -1;
    }
    //1.创建套接字 socket
    int sockfd;
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0)
    {
        perror("socket err.");
        return -1;
    }
    printf("socket ok %d\n", sockfd);

    //填充ipv4的通信结构体  服务器端ip和端口
    struct sockaddr_in serveraddr;
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(atoi(argv[2]));
    serveraddr.sin_addr.s_addr = inet_addr(argv[1]);

    //&serveraddr -->struct sockaddr_in *

    //2.请求链接  connect  
    if (connect(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0)
    {
        perror("connect err.");
        return -1;
    }
    printf("connect ok.\n");

   //3.循环收发消息
   char buf[128];
   int recvbyte;
   while(1)
   {
       fgets(buf,sizeof(buf),stdin);
       if(buf[strlen(buf)-1]=='\n')
         buf[strlen(buf)-1]='\0';
       //发送消息
       send(sockfd,buf,sizeof(buf),0);
   }
   close(sockfd);
    return 0;
}

到了这里,关于简述TCP/IP建立连接过程(附流程和代码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【NVIDIA JETSON AGX XAVIER】与个人笔记本(win11)建立TCP-IP连接传输数据(含源码)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 NVIDIA JETSON AGX XAVIER当作客户端 个人笔记本(win11)当作服务器 首先要将Xavier与笔记本通过网线连接起来,实现Xavier联网(两者 可以相互ping通 就可以)并且需要知道 笔记本的ip地址 (假如现在是192.16

    2024年03月17日
    浏览(52)
  • Linux tcp/ip 网路协议栈学习-00 前言

    Linux tcp/ip 网路协议栈学习-00 前言 目录 Linux  tcp/ip 网路协议栈学习-00 前言 (1)预备知识  (2)前置知识 (3)学习目标 (4)总结     (1)预备知识  好工具事半功倍,做任何事情都需要有方法和工具,同样,阅读 Linux 内核源码也是如此。由于当前内核源码非常庞大,学习上,不能一

    2024年04月26日
    浏览(42)
  • 【c语言】详解c语言#预处理期过程 | 宏定义前言

    c语言系列专栏: c语言之路重点知识整合   创作不易,本篇文章如果帮助到了你,还请点赞支持一下♡𖥦)!!  主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步! 给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ 代码编译到执

    2024年02月01日
    浏览(47)
  • SNMP 计算机网络管理 实验1(二) 练习与使用Wireshark抓取SNMP数据包抓包之 任务三分析并验证TCP三次握手建立连接时三次握手工作过程

    ⬜⬜⬜ 🐰🟧🟨🟩🟦🟪(*^▽^*)欢迎光临 🟧🟨🟩🟦🟪🐰⬜⬜⬜ ✏️write in front✏️ 📝个人主页:陈丹宇jmu 🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​ 🙉联系作者🙈by QQ:813942269🐧 🌈致亲爱的读者:很高兴你能看到我的文章,希望我的文章可以帮助到你,祝万事

    2024年02月12日
    浏览(55)
  • TCP 和 UDP 区别? 2、TCP/IP 协议涉及哪几层架构? 3、描述下 TCP 连接 4 次挥手的过程?为什么要 4 次挥手?

    TCP 基于连接,UDP 基于无连接。 TCP 要求系统资源较多,UDP 较少。 UDP 程序结构较简单。 TCP 保证数据正确性,UDP 可能丢包。 TCP 保证数据顺序,UDP 不保证。 应用层 传输层 互连网络层 网络接口层。 因为 TCP 是全双工,每个方向都必须进行单独关闭。关闭连接时,当 Server 端收

    2024年02月03日
    浏览(41)
  • TCP,TCP 连接建立,TCP 连接断开,Socket 编程

    目录 TCP基本认识 TCP 头格式有哪些? 为什么需要 TCP 协议? TCP 工作在哪一层? 什么是 TCP ? 什么是 TCP 连接? #如何唯一确定一个 TCP 连接呢? UDP 和 TCP 有什么区别呢?分别的应用场景是? #TCP 和 UDP 可以使用同一个端口吗? TCP 连接建立 #TCP 三次握手过程是怎样的? 为什么

    2023年04月27日
    浏览(47)
  • 【网络编程】网络通信基础——简述TCP/IP协议

    个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【网络编程】【Java系列】 本专栏旨在分享学习网络编程的一点学习心得,欢迎大家在评论区交流讨论💌 ip地址简单来说就是用来描述网络上一个设备的所在位置。 端

    2024年02月04日
    浏览(56)
  • 【计算机网络经典面试题】简述 TCP 三次握手和四次挥手的过程

    1)第一次握手:建立连接时,客户端向服务器发送SYN包(seq=x),请求建立连接,等待确认 2)第二次握手:服务端收到客户端的SYN包,回一个ACK包(ACK=x+1)确认收到,同时发送一个SYN包(seq=y)给客户端 3)第三次握手:客户端收到SYN+ACK包,再回一个ACK包(ACK=y+1)告诉服务

    2024年04月08日
    浏览(55)
  • https 建立连接过程分析

    从真实的抓包开始 根据抓包结果可以看到 从客户端发起请求开始,主要经过以下几个过程: 1、 TCP 三次握手 2、浏览器发送 Client Hello 到服务器 3、服务器发送 Server Hello 、证书、证书状态、服务端密钥交换,到浏览器 4、浏览器发送 客户端密钥交换、 Change Cipher Spec 、加密的

    2024年02月08日
    浏览(103)
  • HTTPS连接建立过程

    什么是HTTPS HTTPS,Hyper Text Transfer Protocol over SecureSocket Layer,超文本传输安全协议。 在 TCP 和 HTTP 之间加入了 SSL/TLS 安全协议,使得报文能够加密传输。在 TCP 三次握手之后,还需进行 SSL/TLS 的握手过程,才可进入加密报文传输。 SSL代表安全套接字层。它是一种用于加密和验证

    2024年02月11日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包