TCP跟UDP乱侃
原文链接http://www.cnblogs.com/xiaoEight/archive/2013/02/19/2917814.html
由于最近在恶补关于网络编程的东西,所以决定做个简单的记录。之前做过的东西,虽然有涉及具体的功能实现,但是没有深层系统的去了解过各层各个部分,只是浅尝辄止,实现功能就停了。今天就了解了下传输层,传输层(Transport Layer)是OSI中最重要, 最关键的一层,是唯一负责总体的数据传输和数据控制的一层.传输层提供端到端的交换数据的机制,检查分组编号与次序。
先贴上一张对于程序员的网络分层图:
传输层的协议主要有两个比较重要的协议:
1.用户数据报协议UDP (User Datagram Protocol)
2.传输控制协议TCP (Transmission Control Protocol)
首先说说我自己对这俩协议的简单理解:
UDP可以类似看作单发或群发短信(无接收报告的那种 - -!~),只用知道对方的号码(IP地址跟要发送程序进程的端口号)不用事先征求就可以跟对方发。UDP的优点就是消耗小,UDP将网络数据流量压缩成数据报的形式,每一个数据报用8个字节(8 X 8位=64位)描述报头信息,剩余字节包含具体的传输数据。相比TCP报头变小了就好比短信比电话要便宜一样。但得到好处的同时在另一方面,UDP提供的服务是不可靠的,而且不能保证数据报的顺序。在此还有一点,UDP可分为广播跟组播。
TCP就如同打电话,第一步就是要拨通对方电话,然后别人确认接你的电话。第二步接通电话之后你还要说声喂,然后得到对面的确认回复一声喂,确认连接上。最后就可以通信了。通信完成后,挂电话要是相互知会通知一声。TCP是一种面向连接的,可靠的,基于字节流的传输层通信协议,相比UDP而言可靠性更高,并且基于字节流使得数据是有序的。
由报文的格式图不难看到两个报文的异同,TCP比UDP而言更为复杂。对于两者的使用而言,暂时用比较熟悉的.net稍微提及一下(后面如果有机会我会尝试使用C++在linux环境下对其OS他环境进行通信),在网络编程上微软封装好了,所以也就导致我开篇提到的问题,可能程序员知道怎么用但是不知道原理是什么,甚至都不知道到底是怎么来通信的。(不知道是幸运还是不幸,仁者见仁智者见智吧)。
关于UDP
a.发送
private UdpClient sendUdpClient;
private bool isAnonymous;
private void udpSend(object sender, EventArgs e)
{ // 选择发送模式
if (isAnonymous)
{
// 匿名模式(套接字绑定的端口由系统随机分配)
sendUdpClient = new UdpClient(0);
}
else
{
// 实名模式(套接字绑定到本地指定的端口)
IPAddress localIp = IPAddress.Parse("localip!!!!");
IPEndPoint localIpEndPoint = new IPEndPoint(localIp, int.Parse("localPort!!!!"));
sendUdpClient = new UdpClient(localIpEndPoint);
} Thread sendThread = new Thread(SendMessage);
sendThread.Start("the message for send!!!");
} // 发送消息方法
private void SendMessage(object obj)
{
string message = (string)obj;
byte[] sendbytes = Encoding.Unicode.GetBytes(message);
IPAddress remoteIp = IPAddress.Parse("sendtoIp!!!!");
IPEndPoint remoteIpEndPoint = new IPEndPoint(remoteIp, int.Parse("sendtoport!!!!"));
sendUdpClient.Send(sendbytes, sendbytes.Length, remoteIpEndPoint); sendUdpClient.Close(); }
b.接收
private UdpClient receiveUpdClient; // 接受消息
private void udpReceive(object sender, EventArgs e)
{
// 创建接收套接字
IPAddress localIp = IPAddress.Parse(“localIp!!! ");
IPEndPoint localIpEndPoint = new IPEndPoint(localIp, int.Parse("localPort!!!"));
receiveUpdClient = new UdpClient(localIpEndPoint); Thread receiveThread = new Thread(ReceiveMessage);
receiveThread.Start();
} // 接收消息方法
private void ReceiveMessage()
{
IPEndPoint remoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
while (true)
{
try
{
// 关闭receiveUdpClient时此时会产生异常
byte[] receiveBytes = receiveUpdClient.Receive(ref remoteIpEndPoint); string message = Encoding.Unicode.GetString(receiveBytes); }
catch
{
break;
}
}
}
关于TCP
a.服务器端接受开始监听
private TcpListener tcpLister;
private BinaryReader reader;
private BinaryWriter writer; // 开始监听
private void tcpListerStart(object sender, EventArgs e)
{ tcpLister = new TcpListener(ipaddress,Port);
tcpLister.Start();
// 启动一个线程来接受请求
Thread acceptThread =new Thread(acceptClientConnect);
acceptThread.Start();
} // 接受请求
private void acceptClientConnect()
{
Thread.Sleep(1000);
try
{
//等待连接
tcpClient = tcpLister.AcceptTcpClient();
if (tcpLister != null)
{
networkStream = tcpClient.GetStream();
reader = new BinaryReader(networkStream);
writer = new BinaryWriter(networkStream);
}
}
catch
{
// 停止监听;
Thread.Sleep(1000);
}
}
b.客户端连接服务器
private BinaryReader reader;
private BinaryWriter writer;
// 连接服务器方法,建立连接的过程
private void ConnectToServer()
{
try
{
//对IP端口进行检查
//.......................... IPAddress ipaddress = IPAddress.Parse("serverIp");
tcpClient = new TcpClient();
tcpClient.Connect(ipaddress, int.Parse("serverPort")); // 延时操作
Thread.Sleep(1000);
if (tcpClient != null)
{
networkStream = tcpClient.GetStream();
reader = new BinaryReader(networkStream);
writer =new BinaryWriter(networkStream);
} }
catch
{
Thread.Sleep(1000);
}
}
c.客户端发送消息
private BinaryWriter writer; // 发送消息
private void clientTcpSend(object sender, EventArgs e)
{
Thread sendThread = new Thread(SendMessage);
sendThread.Start("the message for send!!!");
} private void SendMessage(object state)
{
try
{
writer.Write(state.ToString());
Thread.Sleep(5000);
writer.Flush();
}
catch
{
if (reader != null)
{
reader.Close();
}
if (writer != null)
{
writer.Close();
}
if (tcpClient != null)
{
tcpClient.Close();
} //"断开了连接"
}
}
最后
码了这些代码之后,小Eight许久没有码代码,考虑后续尝试下完成一个可用的具体小例子。由于这次的内容有点小多也是有点小乱,写到最后自己也凌乱了,可能会出现错误或者不对的地方,希望大家给予指正。后面还会的对UDP的组播和广播,TCP的详细使用进行进一步的了解,一步一步的迈向网络的“深渊”。
TCP跟UDP乱侃的更多相关文章
- TCP、UDP、RTP(RTCP)异同与区别
OSI七层模型OSI 中的层 功能 TCP/IP协议族 应 用层 ...
- [转]一些TCP和UDP使用问题汇总
下面是在实际后台开发中遇到的一些关于TCP和UDP的问题,这里慢慢积累起来: UDP连续发送2次数据包,第一次发100字节,第二次发200字节,服务端recvfrom(1000)时收到100.200还 ...
- TCP与UDP协议
传输控制协议(Transmission Control Protocol, TCP)和用户数据报协议(User Datagram Protocol, UDP)是典型的传输层协议. 传输层协议基于网络层 ...
- TCP与UDP的不同接包处理方式
TCP与UDP的不同接包处理方式 1.UDP发包的问题问:udp 发送两次数据,第一次 100字节 ,第二次200字节, 接包方一次recvfrom( 1000 ), 收到是 100,还是200,还是 ...
- [译]再次对比TCP与UDP
免责声明:和往常一样,此文章的观点都属于‘No Bugs’Hare(译注:一个网站) ,也许不一定和翻译者或者Overload编辑的意见一致.同时,翻译者从Lapine翻译到英语也具有一定的难度.除此 ...
- TCP和UDP的最完整的区别
TCP UDP TCP与UDP基本区别 1.基于连接与无连接 2.TCP要求系统资源较多,UDP较少: 3.UDP程序结构较简单 4.流模式(TCP)与数据报模式(UDP); ...
- 一些重要的计算机网络协议(IP、TCP、UDP、HTTP)
一.计算机网络的发展历程 1.计算机网络发展 与其说计算机改变了世界,倒不如说是计算机网络改变了世界.彼时彼刻,你我都因网络而有了交集,岂非一种缘分? 计算机与网络发展大致经历如下过程:
- TCP与UDP区别总结
TCP与UDP区别总结:1.TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接2.TCP提供可靠的服务.也就是说,通过TCP连接传送的数据,无差错,不丢失,不重 ...
- 知其所以然~tcp和udp的区别
TCP UDP TCP与UDP基本区别 基于连接与无连接 TCP要求系统资源较多,UDP较少: UDP程序结构较简单 流模式(TCP)与数据报模式(UDP); TCP保证数据正确性,UDP可能丢包 T ...
随机推荐
- asp.net MVC 路由系统
ASP.NET的路由系统是基于物理文件的路由注册,通过调用System.Routing.RouteTable的Routes(RouteCollection)属性的MapPageRoute()方法来完成 ...
- [置顶] ZK(The leading enterprise Ajax framework)入门指南
1. Why ZK JavaEE领域从来就不缺少Framework尤其是Web Framework,光是比较流行的就有:SpringMVC.Struts2.JSF系列…… 其它不怎么流行的.小众的.非 ...
- RSA算法优化
RSA算法优化 大数乘法 模乗优化 剩余定理(孙子定理) RSA加解密 python的RSA计算优化 #-*- coding: utf-8 -*- ''' /********************* ...
- vps使用(centos)
javaweb开发,vps来做个人测试 首先配置vps(centos) 1.安装javeweb环境 用ssh远程服务器后,中文乱码,因为ssh的字符集和服务器的字符集不一致,服务器是utf-8,可以通 ...
- 用原生VideoView进行全屏播放时的问题
之前参加了一个课程,里面有一节讲到了用视频作为启动界面.讲师用的是自定义VideoView,重写onMeasure方法,因为原生的VideoView在那情况下不能实现全屏播放.当时没有深入研究,现在补 ...
- 使用kettle工具将文本文件的内容插入Linux虚拟机下的mysql表中
一. 解压kettle包 1.把包拷到Linux系统下 还有mysql的驱动包 2.解压zip后缀的包 输入命令:unzip /software/pdi-ce-7.0.0.0-25.zip ...
- 开发一个微信小程序教程
一.注册小程序账号 1.进入微信公众平台(https://mp.weixin.qq.com/),注册小程序账号,根据提示填写对应的信息即可. 2.注册成功后进入首页,在 小程序发布流程->小程序 ...
- TCP/IP传输层,你懂多少?
1. 传输层的主要功能是什么?2. 传输层如何区分不同应用程序的数据流?3. 传输层有哪些协议?4. 什么是UDP协议?5. 为什么有了UDP,还需要TCP?6. 什么是TCP协议?7. 怎么理解协议 ...
- 关于在freemarker模板中遍历数据模型List<JavaBean>的经验
本文采用简单的servlet作为后台处理数据的工具,前台使用freemarker的ftl模板作为输出工具,简单说明怎样将封装有实体类对象的List集合注入到ftl模板中并且成功的在遍历显示出来,之前在 ...
- 菜鸟互啄:WINFORM如何实现无聚焦框的Button按钮
当我们将一个button按钮设置如下属性时,总有一个聚焦框来困扰着我们 button1.FlatStyle = FlatStyle.Flat; 我们想要的效果是这样的: 但当使用了Tab切换焦点时 发 ...