C# Socket网络编程(三)

C# WinForm基础三 socket网络编程 一、Socket网络编程 概念:Socket ocket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。 阅读详情

目录

Socket/TCP

TCP报文格式

TCP三次握手

四次挥手

三次握手和四次挥手面试问题

Socket编程

Socket编程方式

数据传输方式

服务器编写步骤

客户端编写步骤


Socket/TCP

TCP报文格式

TCP是一种协议

报文:报纸文字

TCP报文是发送网络消息需要按照这种报文的格式去包装数据

例如:

TCP规定的数据包格式:

亲爱的[xxx],你好,[XXXXX],保重勿念![xxxx]年[xx]月[xx]日。

那么按照TCP发送一句话:“I Love You”,则这句话必须按照上面的协议类型包装

亲爱的[小明],你好,[I Love You],保重勿念![2020]年[03]月[27]日。

 

一般需要了解一下几个字段:

  1. 序号:Seq序号,占32位,用来表示从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标识

  2. 确认序号:ACK序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ACK=Seq+1

  3. 标志位共六个:URG、ACK、PSH、RST、SYN、FIN含义:

    1. URG:紧急指针

    2. ACK:确认序号有效

    3. PSH:接收方应该尽快将这个报文交给应用层

    4. RST:充值连接

    5. SYN:发起一个新连接

    6. FIN:释放一个连接

  4. 需要注意的是:

    (A)不要将确认序号Ack与标志位中的ACK搞混了。 (B)确认方Ack=发起方Req+1,两端配对

TCP三次握手

所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发,整个流程如下图所示:

第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SEND状态,等待Server确认。

第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ACK=J+1,随机产生一个seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RECV状态。

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

SYN攻击:在三次握手过程中,Server发送SYN-ACK后,收到Client的ACK之前的TCP连接称为半连接,此时Serve处于SYN_RECV状态,当收到ACK后,Server转入ESTABLISHED状态。SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断的发送SYN包,Server回复确认包,并等待Client的确认,由于源地址不存在,因此Server需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络阻塞甚至系统瘫痪。SYN攻击就是一种典型的DDOS攻击,检测SYN攻击方式也很简单,即当有大量半连接状态且源地址是随机的,则可以断定遭到SYN攻击了,使用如下命令让其无处可逃:netstat -nap|grep SYN_RECV

四次挥手

所谓四次挥手即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总发送三个包以确认连接的断开。在Socket编程中,这一过程由客户端或服务端任一方执行close来触发,流程如下:

由于TCP连接是全双工的,因此每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。

(1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传输,Client进入FIN_WAIT_1状态。

(2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态

(3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传输,Server进入LAST_ACK状态

(4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手

三次握手和四次挥手面试问题

(1)为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?

这是因为Server在LISTEN状态下,当收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不在发送数据了但是还能接受数据,己方也未必全部数据都发送给对方,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方表示同意现在关闭连接,因此己方ACK和FIN一般都会分开发送。

(2)为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?

这是因为虽然双方都同意关闭连接了,而且握手的四个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到ESTABLISHED状态那样),但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于LAST_WAIT状态下的Socket可能会因为超时未收到ACK报文而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文。

Socket编程

Socket编程方式

Socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开Open->读写write/read->关闭close”模式来操作文件。Socket就是该模式的一个实现,Socket即是一种特殊的文件,一些Socket函数就是对其进行操作(读写IO、打开、关闭)。因此Socket也提供了类似于连接Connect、关闭连接Close、发送、接收等方法的调用

数据传输方式

常用stream和dgram

  1. STREAM表示面向连接的数据传输方式,数据可以准确无误地到达另一台计算机,如果丢失或损坏,可以重新发送,但是相对效率低

  2. DGRAM表示无连接的数据传输方式,计算机只管数据传输,不做数据校验,DGRAM所做的校验工作少,所以效率比STREAM高

QQ视频聊天和语音聊天使用的就是DGRAM传输数据,因为首先需要保证通信的效率,尽量减少延迟,而数据的正确性是次要的,即使丢失很小的一部分数据视频和音频也可以正常解析,最多出现噪点或杂音,不会对通信质量有实质影响

服务器编写步骤

  1. 调用socket()函数创建一个用于通信的套接字

    买了个手机

  2. 给已经创建的套接字绑定一个端口号,一般通过设置网络套接口地址和调用bind()函数来实现

    办张手机卡,插上手机卡

  3. 调用listen()函数使套接字成为一个监听套接字

    等待来电

  4. 调用accept()函数来接受客户端的连接,这时就可以和客户端通信

    接听到了打来的电话

  5. 处理客户端的连接请求

    接通电话听、说沟通

  6. 终止连接

    挂断电话

客户端编写步骤

  1. 调用socket()函数创建一个用于通信的套接字

    买了个手机

  2. 通过设置套接字地址结构,说明客户端与之通信的服务器的IP地址和端口号

    输入对方手机号

  3. 调用Connect()函数来建立与服务器的连接

    拨号,并等接听

  4. 调用读写函数发送或接收数据

    说话、听话

  5. 终止连接

    挂断电话

 

C#网络编程系列文章(一)之Socket实现异步TCP服务器 原创性声明 开篇 本人因为对于网络编程的喜爱,经常性的使用c#编写各类服务器(e.g TCP服务器,UDP服务器),但是基本上都是搞着玩,网上也有很多讲c#网络编程的文章,当然我也参考了很多作者写的文章。看了这篇文章以后再也不用导出找资料了。 本系列文章会依次介绍使用Socket实现的异步TCP服务器、同步TCP服务器、异步UDP服务器、同步UDP服务器 and 使用TcpListe 阅读详情

相关推荐

Altium Designer铺铜陷阱:为什么你的死铜总是清除不干净?

本文深入探讨Altium Designer中铺铜操作导致死铜无法清除的常见问题,分析死铜形成的五大诱因,并提供高级参数优化和网络连接性验证技巧。通过调整边界计算精度和泪滴算法设置,有效解决死铜残留问题,提升PCB设计质量与制造良率。

weixin_29169505的博客 359

两张动图-彻底明白TCP的三次握手与四次挥手

两张动图解析三次握手,四次挥手

qzcsu的博客 50万+

深入解析Mifare Classic Crypto1认证流程与密钥交换机制

本文深入解析Mifare Classic Crypto1认证流程与密钥交换机制,详细介绍了Crypto1加密算法的工作原理、认证初始化阶段、随机数交换与密钥流生成过程,以及双向验证步骤。文章还分析了Mifare Classic的安全漏洞,包括随机数生成缺陷和密钥流恢复攻击,并提供了Proxmark3实战演示和防护建议。

c6d7e8f9g的博客 898

Socket 编程基础

套接字(socket)是 Linux 下的一种进程间通信机制(socket IPC),在前面的内容中已经给大家提到过,使用 socket IPC 可以使得在不同主机上的应用程序之间进行通信(网络通信),当然也可以是同一台主机上的不同应用程序。socket IPC 通常使用客户端服务器这种模式完成通信,多个客户端可以同时连接到服务器中,与服务器之间完成数据交互。内核向应用层提供了 socket 接口,对于应用程序开发人员来说,我们只需要调用 socket 接口开发自己的应用程序即可!

Bit_Dong的博客 3万+

Redhawk解析PAD / IOPAD的实现方法

Redhawk解析IOPAD的实现方法1. IOPAD DEF的概念说明2. 生成 IOPAD GDS文件3. 生成 IOPAD DEF文件4. Redhawk解析过程中读取IOPAD DEF 本文主要简述【Redhawk解析IOPAD】的实现原理方法,具体脚本没有放在这里。 1. IOPAD DEF的概念说明 2. 生成 IOPAD GDS文件 注: getinfo2IODEF.tcl 是基于innovus获取IOPAD的摆放信息以及库信息。 run_cerate_iopadgds.csh 是基于c

kobayashiyou的博客 3154

告别‘小目标’丢失!手把手复现DNANet红外检测网络(PyTorch版)

本文详细介绍了如何使用PyTorch从零实现DNANet红外小目标检测网络,重点解析了DNIM模块和CSAM注意力机制的设计与实现。通过实战教程,帮助开发者解决红外小目标检测中的特征提取和训练调参难题,适用于军事侦察、安防监控等场景。

weixin_28701593的博客 251

TCP连接管理——三次握手和四次挥手

TCP连接的建立——三次握手 TCP连接的建立过程通常被称为“三次握手”。客户端与服务器之间建立TCP连接的过程如下。 三次握手 客户端向服务器发送一个特殊的TCP报文段——SYN报文段。它不包含数据,但是会将TCP首部的SYN设置为1。并且,客户端会随机生成一个初始序号(client_isn)放在该报文段的序号字段中。随机生成序号有利于避免某些网络攻击。 服务器接收客户端发...

zy010101博客 7767

修改 Alist 密码时报错?看看这个坑怎么解决!

启动服务后,再修改密码”。以后再遇到类似问题,先检查服务是否正常运行,说不定就能少踩不少坑。如果还有其他 Alist 的问题,欢迎在评论区留言交流~

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1153

TCP三次握手(详解)

一:引出 客户端与服务器之间数据的发送和返回的过程当中需要创建一个叫TCP connection的东西;由于TCP不存在连接的概念,只存在请求和响应,请求和响应都是数据包,它们之间都是经过由TCP创建的一个从客户端发起,服务器接收的类似连接的通道,这个连接可以一直保持,http请求是在这个连接的基础上发送的;在一个TCP的连接上是可以发送多个http请求的 二:TCP的报文格式 1:TCP在传输层和网络层数据传输的过程 TCP协议是在传输层端到端的传输信息,既然说到传输层协议,那么就讲一下传输层协议在数据传

qq_48508278的博客 9万+

S7-1200PLC与昆仑通态触摸屏以太网通信的具体方法和步骤(图文)

S7-1200PLC与昆仑通态触摸屏以太网通信的具体方法和步骤(图文)

Robot_PLC_HMI_Automation 1万+

Test软件:Keysight二次开发_(3).安装与配置开发环境

在开始进行Keysight软件的二次开发之前,首先需要确保您的开发环境已经正确安装和配置。本节将详细介绍如何安装和配置必要的开发工具和依赖项,以便您能够顺利进行开发工作。

2401_87715305的博客 1413

TCP/IP 三次握手

TCP/IP 三次握手

喵酱 1万+

5步VS传统WinForm!AntdUI让界面设计从“土味”到“超模”只需30秒?

摘要:墨瑾轩编程教程《AntdUI的5大魔法步骤》详解如何将传统WinForm升级为现代化UI。教程通过5个核心步骤:安装AntdUI库、控件替换、主题定制、复杂布局构建及实战案例演示,对比传统开发与AntdUI在美观度(动态阴影/动画)、开发效率(拖拽组件VS手工绘制)和主题定制(一键换肤VS重写控件)的显著差异。使用C#代码示例展示按钮动画、3D翻转、聊天界面等特效实现,帮助开发者快速掌握这一基于Ant Design风格的WinForm增强框架。(150字)

java专栏 1125

C#网络编程技术微软Socket实战项目演练(三)

一、课程介绍 本次分享课程属于《C#高级编程实战技能开发宝典课程系列》中的第三部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集、整理和完善此系列课程!本次高级系列课程适合人群如下: 1、有一定的NET开发基础并对Socket技术有一定了解和认识。 2、喜欢阿笨的干货分享课程的童鞋们。 希望大家在选择阿笨的C#高级编程实战技能开发宝...

跟着阿笨一起玩NET 964

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C#网络编程(三、Socket同步传输字符串)

本文转自:http://blog.youkuaiyun.com/shanyongxu/article/details/51189335http://blog.youkuaiyun.com/shanyongxu/article/details/51189335,本人学习受益匪浅,楼主把重点都标记出来了,请点击链接查看原文,尊重楼主大大版权。 同步传输字符串

鳄鱼泪的博客 4090

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C#.网络编程 Socket基础(三) 基于WinForm系统Socket TCP协议 实现端到端(服务器与客户端).txt.word.png等不同类型文件传输

一、简介: 前面的两篇介绍了字符串传输、图片传输: Socket基础(一)字符串传输https://blog.youkuaiyun.com/xpj8888/article/details/83383355 Socket基础(二)图片传输https://blog.youkuaiyun.com/xpj8888/article/details/83443853 其实,本文针对Socket基础(二)进一步完成,以便可以进...

xpj8888的博客 1587

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C# 学习周总结|多线程、Socket 网络编程、LINQ

本周学习总结:重点掌握了C#多线程、Socket网络编程和LINQ三大核心知识点。在多线程方面,理解了前台/后台线程区别、线程安全问题和lock锁的正确使用方式;Socket部分掌握了UDP/TCP协议特点及实现方法,包括服务端绑定、客户端连接等关键步骤;LINQ重点学习查询语法与方法语法,以及Where、Select、GroupBy等常用操作符。实践过程中遇到线程重复启动、锁失效、TCP粘包、LINQ延迟执行等典型问题,通过调试掌握了解决方案。这些内容不仅是开发必备技能,也是面试高频考点。

2401_83341984的博客 352

C#多线程,网络编程和Linq语法

网络编程是实现设备互联互通的核心技术,本质是“基于协议的字节流传输与处理”。本次学习掌握基础的Socket通信、TCP/UDP协议应用,但网络编程涉及底层协议、并发、安全等多维度知识。后续需结合实际项目(如简易聊天室、文件传输工具)深化理解,同时补充网络安全、高性能通信框架(如SignalR)等内容,形成从基础到进阶的完整知识体系。LINQ的核心价值是“统一查询语法、简化数据操作、提升开发效率”,它将查询逻辑融入C#语言,避免了“不同数据源写不同查询代码”的问题。

weixin_74123105的博客 444

【层面一】C#语言基础和核心语法-04(Socket/类加载/多线程)

文章摘要: 本文通过生动的比喻系统讲解了.NET中的类加载机制和多线程原理。类加载被比喻为"建筑公司读取蓝图"的过程,详细阐述了CLR按需加载类的5个阶段:程序集定位→元数据读取→内存分配→静态初始化→就绪使用。重点分析了静态构造函数的陷阱与初始化时机控制。多线程部分则用"厨房厨师"类比,介绍了.NET线程管理的演进:从直接控制Thread类,到线程池ThreadPool优化资源,再到基于任务的Task并行库。文章揭示了两种机制的核心设计思想:类加载的惰性优化原则和多

Tiger_shl的博客 1166

C# 语言进阶(九)泛型、内置集合、Socket网络

泛型(Generic)通过类型参数化(如List<T>)实现代码复用,支持类/方法/委托,需用where约束类型(如where T : class, new()),避免装箱提升性能。内置集合中Dictionary<K,V>(泛型哈希表)和List<T>(动态数组)最常用,替代非泛型的Hashtable/ArrayList。Socket网络编程分TCP(可靠连接,三次握手)和UDP(无连接高速),服务端流程创建Socket→Bind→Listen→Accept→收发数据

2301_80252792的博客 233

C#网络编程(Socket编程)

一、Socket网络编程 1.Socket是什么? 在计算机通信领域,Socket被译为“套接字”。它是计算机之间进行通信的一种约定或一种方式。通过Socket这种约定可以接收到其他计算机的数据,也可以向其他计算机发送数据。 2.本质 是编程接口(API),对于TCP/IP的封装,TCP/IP也提供了可供程序员做网络开发所用的接口 3.作用 Socket的英文原意是“插座”,的意思,通常在计算机编...

dust__的博客 2万+
上一篇: C# Socket网络编程(二)
下一篇: C#事件多线程(一)
满山猴子
博客等级 码龄7年 48粉丝 64原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值