tcp连接+套接字编程

tcp头部

tcp端口号

TCP的连接是需要四个要素确定唯一一个连接:
(源IP,源端口号)+ (目地IP,目的端口号)
所以TCP首部预留了两个16位作为端口号的存储,而IP地址由上一层IP协议负责传递
源端口号和目地端口各占16位两个字节,也就是端口的范围是2^16=65535
另外1024以下是系统保留的端口,从1024-65535是用户使用的端口范围

tcp序号和确认号

32位序号 seq:Sequence number 缩写seq ,TCP通信过程中某一个传输方向上的字节流的每个字节的序号,通过这个来确认发送的数据有序,比如现在序列号为1000,发送了1000,下一个序列号就是2000。

32位确认号 ack:Acknowledge number 缩写ack,TCP对上一次seq序号做出的确认号,用来响应TCP报文段,给收到的TCP报文段的序号seq加1,即表示期待下一次发送的序号

tcp标志位

每个TCP段都有一个目的,这是借助于TCP标志位选项来确定的,允许发送方或接收方指定哪些标志应该被使用,以便段被另一端正确处理。
用的最广泛的标志是 SYNACK 和 FIN,用于建立连接,确认成功的段传输,最后终止连接。

  1. SYN:简写为S,同步标志位,用于建立会话连接,同步序列号;
  2. ACK: 简写为.,确认标志位,对已接收的数据包进行确认,1表示确认号有效,0表示报文中不包含确认信息;
  3. FIN: 简写为F,完成标志位,表示我已经没有数据要发送了,即将关闭连接;
  4. PSH:简写为P,推送标志位,表示该数据包被对方接收后应立即交给上层应用,而不在缓冲区排队;
  5. RST:简写为R,重置标志位,用于连接复位、拒绝错误和非法的数据包;
  6. URG:简写为U,紧急标志位,表示数据包的紧急指针域有效,用来保证连接不被阻断,并督促中间设备尽快处理;

tcp的三次握手

第一次握手
客户端将TCP报文标志位SYN置为1,随机产生一个序号值seq=x,将该数据包发送给服务器端,发送完毕后,客户端进入SYN_SENT状态,等待服务器端确认。

第二次握手
服务器端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务器端将TCP报文标志位SYN和ACK都置为1,ack=x+1,随机产生一个序号值seq=y,并将该数据包发送给客户端以确认连接请求,服务器端进入SYN_RCVD状态。

第三次握手
客户端收到确认后,检查ack是否为x+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=y+1,并将该数据包发送给服务器端,服务器端检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,客户端和服务器端进入ESTABLISHED状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。

为什么连接的建立需要三次握手?

假设client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。

假设采用的是“两次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。

tcp的四次挥手

第一次挥手: Client端发起挥手请求,向Server端发送标志位是FIN报文段,设置序列号seq,此时,Client端进入FIN_WAIT_1状态,这表示Client端没有数据要发送给Server端了。

第二次分手:Server端收到了Client端发送的FIN报文段,向Client端返回一个标志位是ACK的报文段,ack设为seq加1,Client端进入FIN_WAIT_2状态,Server端告诉Client端,我确认并同意你的关闭请求。

第三次分手: Server端向Client端发送标志位是FIN的报文段,请求关闭连接,同时Client端进入LAST_ACK状态。

第四次分手 : Client端收到Server端发送的FIN报文段,向Server端发送标志位是ACK的报文段,然后Client端进入TIME_WAIT状态。Server端收到Client端的ACK报文段以后,就关闭连接。此时,Client端等待2MSL的时间后依然没有收到回复,则证明Server端已正常关闭,那好,Client端也可以关闭连接了。

为什么连接的关闭需要四次挥手?

由于TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议,TCP是全双工模式。这就意味着,关闭连接时,当Client端发出FIN报文段时,只是表示Client端告诉Server端数据已经发送完毕了。当Server端收到FIN报文并返回ACK报文段,表示它已经知道Client端没有数据发送了,但是Server端还是可以发送数据到Client端的,所以Server很可能并不会立即关闭SOCKET,直到Server端把数据也发送完毕。当Server端也发送了FIN报文段时,这个时候就表示Server端也没有数据要发送了,就会告诉Client端,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。

为什么要等待2MSL?

第一点:保证TCP协议的全双工连接能够可靠关闭
由于IP协议的不可靠性或其它网络原因,导致了Server端没有收到Client端的ACK报文,发生超时。那么Server重发FIN,如果此时Client端的连接关闭了,则重发的FIN就找不到对应的连接,导致连接错乱。

第二点:保证这次连接的重复数据段从网络中消失
如果Client端发送最后的ACK后直接进入CLOSED状态,然后又再向Server端发起一个新连接,这时如果新老连接的端口号如果相同。

那么就可能出现问题:如果老连接某些数据滞留在网络中,这些延迟数据在建立新连接后到达Client端,由于新老连接的端口号和IP都一样,TCP协议就认为延迟数据是属于新连接的,新连接就会接收到脏数据,这样就会导致数据包混乱。

接口认识

创建套接字(客户端&服务器)

 创建套接字首先得选择使用什么协议簇得套接字,比如使用ipv4协议(AF_INET)还是使用ipv6协议(AF_INET6)。其次选择该套接字的类型,是使用面向字节流(SOCK_STREAM)还是面向数据报(SOCK_DGRAM)的套接字。第三个参数一般是置为0的

该结果的返回值:成功return一个新的socket的文件描述符(fd),失败则返回-1。

绑定套接字(服务器)

绑定套接字需要选择绑定哪一个套接字(未建立连接),其次选择该套接字使用什么地址簇,绑定哪个端口,绑定哪个ip。第三个参数是第二个结构参数的大小。 

关于第二个参数,这里有必要说明一下。各种网络协议的地址格式并不相同。IPv4地址用sockaddr_in结构体表示。大多时候,我们也是基于ipv4编程。下边是关于sockaddr_in结构体的介绍。

地址簇的选择一般是选择AF_INET,即ipv4。

端口号的绑定,还需要介绍一下,这里我们的端口号是基于主机序列的,而我们需要将主机序列的端口号转换为网络序列进行绑定。需要使用htons()函数。htons()作用是将端口号由主机字节序转换为网络字节序的整数值,(host to net)

htonl()作用和htons()一样,不过它针对的是32位的(long),而htons()针对的是16位的(short)。

与htonl()和htons()作用相反的两个函数是:ntohl()和ntohs()。

ip地址的绑定,这里还有一个in_addr的结构体。

我们传过去的ip地址一般都是点分十进制的,是便于我们识别的一种形式,需要将其转换成网络序列。inet_addr()作用是将一个IP字符串转化为一个网络字节序的整数值。一般需要转换成为网络序列的是客户端。作为服务端,需要接受所有发向该主机的该端口的数据。(一台主机可能配置多个ip)。因此:INADDR_ANY的宏值绑定在ip地址上就能解决这种问题。

监听套接字(服务器)

 listen的第二个参数是监听队列大小。

Linux内核协议栈为一个tcp连接管理使用两个队列:

1. 半链接队列(用来保存处于SYN_SENT和SYN_RECV状态的请求)

2. 全连接队列(accpetd队列)(用来保存处于established状态,但是应用层没有调用accept取走的请求

而全连接队列的长度会受到 listen 第二个参数的影响。

接收套接字(服务器)

首先选择从哪个欢迎套接字接收新的套接字,其次该套接字使用什么类型的网络协议结构, 第三个参数是第二个结构体的大小(注意其类型)。

连接套接字(客户端)

首先选择连接该套接字的fd,其次选择该套接字使用什么格式的网络地址簇,端口是什么。第三个参数是第二个参数结构体的大小。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/128508.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

idea的GsonFormatPlus插件教程

1 安装 插件 打开idea, File—>Setting—>Plugins,搜索 GsonFormatPlus 直接安装 2 json 转化为 实体类 2.1 新建一个类 2.2 点击右键 2.4 点击Format 生成注释

拓展外部SRAM

外部拓展芯片 IS62WV51216A 芯片手册 支持高速时钟通道时间为45、55ns 芯片引脚定义 通道时序 读定义表 一个纵列表示当前使用的高速通道的时间,选一个纵列作为参数标准。 地址控制读时序 如图,大概需要三个参数 写时序定义表 还是选择55ns参数 写…

解决table 操作栏塌陷的问题

1. el-table 塌陷 2. 解决办法 是通过查看官网,看见有一个重新布局的方法 https://element.eleme.cn/#/zh-CN/component/table 3. 代码实现 先将table 绑定ref 调用ref 方法 就ok了

正则表达式:实数

正则表达式:实数 校验字符串,为有效的实数。 可以为:正数或负数; 可以为:整数或小数; 但是,不可以为非数值型的字符串,不可以是一连串的“0” 。 原始正则表达式 ^-?(0|[1-9]\d…

postman和node.js的使用

一 nodejs下载 下载链接: nodejs官网: https://nodejs.org/zh-cn/download 我使用的windows .msi安装方式,双击一直下一步就行 当前安装完成后的版本:1.下载 2.安装步骤 下载完成后,双击安装包,开始安装&…

Python串口通信模块PySerial使用教程(CH340 USB TTL转接芯片)

CONTENTS 1. CH340 USB TTL介绍2. PySerial教程 1. CH340 USB TTL介绍 TTL 一般是从单片机或者芯片中发出的电平,高电平为 5V(51单片机)或者 3.3V(STM32)。USB 转 TTL 模块的作用就是把电平转换到双方都能识别进行通信…

postgresql-窗口函数种类

postgresql-聚合窗口函数 聚合函数排名窗口函数案例1案例2 取值窗口函数环比增长率同比增长率 聚合函数 常用的聚合函数,例如 AVG、SUM、COUNT 等,也可以作为窗口函数使用 --计算移动平均值 select saledate, amount, avg(amount) over (order by sale…

【数据结构】二叉树基础入门

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …

机器学习从0到1

机器学习,即machine learning 感谢easyai的精彩讲解: easyai网址 文章目录 机器学习的概念机器学习的原理监督学习,非监督学习,强化学习监督学习非监督学习强化学习 机器学习实操的7个步骤现在举一个具体的任务来说明这些步骤1.收…

在Postman的脚本中使用pm对象获取接口的请求参数

在Postman的脚本中使用pm对象获取接口的请求参数 1、获取在Query Params中输入的参数全局变量的引用(以在header中引用为例)2、获取在Body中输入的参数3、pm对象常用用法 1、获取在Query Params中输入的参数 query params页面 在tests中写脚本做后置处…

【ArcGIS pro】-使用arcpy一次保存多个布局

在arcgis Pro中常常会创建多个地图和多个布局,本文介绍如何使用代码,一次保存多个布局文件 在arcgis pro中打开python视图 找到工程位置 在python视图中输入如下代码 保存为pdf import arcpy# 设置当前项目,这通常是一个.aprx文件 projec…

华为云云耀云服务器L实例评测|华为云耀云L搭建zerotier服务测试

0. 环境 - Win10 - 云耀云L服务器 1. 安装docker 检查yum源,本EulerOS的源在这里: cd /etc/yum.repos.d 更新源 yum makecache 安装 yum install -y docker-engine 运行测试 docker run hello-world 2. 运行docker镜像 默认配…

【广州华锐互动】AR远程协助技术提供实时远程协作和指导

随着科技的不断发展,企业的运营管理模式也在不断地进行创新和升级。在这个过程中,AR(增强现实)技术的应用逐渐成为了企业运维管理的新兴趋势。AR远程协助平台作为一种结合了AR技术和远程协助理念的技术手段,为企业运维…

信息安全技术 办公设备安全测试方法

声明 本文是学习GB-T 38558-2020 信息安全技术 办公设备安全测试方法. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 办公设备安全测试方法范围 本标准规定了办公设备安全技术要求和安全管理功能要求的测试方法。 本标准适用于测试机构、办公设备厂…

Edge浏览器没有让我失望! 今天终于可以在win10中模拟IE内核进行前端测试了!

前言 😝 ietest现在是不是不好用了? Edge浏览器仿真是不是不见了? 如图 如果我们在前端开发javascript遇见一些老旧的语法标准,想要测试一下都难,想想都抓狂!😤😤 不过不用担心,经过这几天的…

Idea上传gitee注意事项,push reject错误

一、 你在项目所在文件夹的空白处,鼠标右键,点击git bash here 会自动进入该目录下 二、 如果你遇到push reject 输入下面的命令: git pull origin master –allow-unrelated-historiesgit push -u origin master -f再次push就好了。 三、 …

wpf C# 用USB虚拟串口最高速下载大文件 每包400万字节 平均0.7s/M,支持批量多设备同时下载。自动识别串口。源码示例可自由定制。

C# 用USB虚拟串口下载大文件 每包400万字节 平均0.7s/M。支持批量多设备同时下载。自动识别串口。可自由定制。 int 32位有符号整数 -2147483648~2147483647 但500万字节时 write时报端口IO异常。可能是驱动限制的。 之前用这个助手发文件,连续发送&#xff0…

【python爬虫】批量识别pdf中的英文,自动翻译成中文上

不管是上学还是上班,有时不可避免需要看英文文章,特别是在写毕业论文的时候。比较头疼的是把专业性很强的英文pdf文章翻译成中文。我记得我上学的时候,是一段一段复制,或者碰到不认识的单词就百度翻译一下,非常耗费时间。本文提供批量识别pdf中英文的方法,后续文章实现自…

PatchMatchNet 学习笔记 译文 深度学习三维重建

9 PatchMatchNet CVPR-2021 patchmatchnet源码下载 PatchMatchNet 代码注释版 下载链接(注释非常详细,较源码结构有调整,使用起来更方便) PatchMatchNet-CVPR-2021(源码、原文+注释+译文+批注) 9.0 主要特点 金字塔,基于传统的PatchMatch算法,精度高,速度快 Pa…

后端SpringBoot+前端Vue前后端分离的项目(二)

前言:完成一个列表,实现表头的切换,字段的筛选,排序,分页功能。 目录 一、数据库表的设计 ​编辑二、后端实现 环境配置 model层 mapper层 service层 service层单元测试 controller层 三、前端实现 interface接…