golang实现简易TCP服务以及TCP和UDP协议对比
2017-03-25 23:57
435 查看
引言
ECHO(Echo Protocol,回绕协议,应答协议,如linux中的echo命令),用于查错及测量应答时间(运行在TCP和UDP协议上)本文示例为echo协议,服务器只需把收到的客户端的请求数据发给这个客户端即可,其它什么功能都不做。tcp/ip是一个协议簇(族),TCP(传输控制协议)和IP(网际协议)是此协议簇的核心。七层OSI模型中,tcp/udp在传输层,而ip在网络层。
OSI七层协议由上到下分别是:应用层(http,https),表示层(简单地说不同计算机通信会话进行表示转化,使系统能够识别,把数据转换为能与接收者的系统格式兼容并适合传输的格式。),会话层(设置和维护电脑之间通信连接,ssh),传输层(TCP/UDP),网络层(网际协议IP),数据链路层(表头和表尾被加至数据包形成帧。数据链表头(DLH)是包含了物理地址和错误侦测及改错的方法。数据链表尾(DLT)是一串指示数据包末端的字符串,如以太网),物理层(针脚、电压、线缆规范、集线器、中继器、网卡、主机适配器);
运行在tcp上的协议有http,https,ftp,pop3(邮局协议,收邮件),SMTP(Simple Mail Transfer Protocol,简单邮件传输协议,发送邮件)。运行在UDP上的协议有DHCP(Dynamic Host Configuration Protocol,动态主机配置协议,动态配置IP地址)。
DNS(Domain Name Service,域名服务),用于完成地址查找,邮件转发等工作(运行在TCP和UDP协议上)。
TCP和UDP的区别
TCP(Transmission Control Protocol)是传输控制协4000
议,UDP(User Datagram Protocol)是用户数据报协议。
TCP是面向指定连接的,UDP是面向广播,非连接的,TCP确认数据传输完整性和数据抵达,而UDP不保证。
TCP是数据安全的,使用三次握手进行安全确认,使用四次挥手断开连接。第一次客户端申请和服务器握手,第二次服务器确认后申请和客户端握手,第三次客户端发送ACK(Acknowledgement)确认字符申请握手,建立连接;四次挥手可以由任何一端发起,被发起的一端将会握手两次确认已无数据发送,最后由发起第一次关闭握手的一端发起最后一次握手关闭连接。
TCP发送的数据量大小,以及发送效率低于UDP。
UDP中应用如ping命令,DHCP,DNS,在线视频媒体,电视广播和多人在线游戏;基于TCP的协议有Telnet,FTP以及SMTP,TCP和UDP与生俱来的特性决定了他们各自的应用领域
TCP客户端和服务器的简易go实现
服务端完整编码:package main import ( "net" "fmt" ) func main(){ // tcp 监听并接受端口 l, err := net.Listen("tcp", "127.0.0.1:65535") if err != nil { fmt.Println(err) return } //最后关闭 defer l.Close() fmt.Println("tcp服务端开始监听65535端口...") // 使用循环一直接受连接 for { //Listener.Accept() 接受连接 c, err := l.Accept() if err!= nil { return } //处理tcp请求 handleConnection(c) } } func handleConnection(c net.Conn) { //一些代码逻辑... fmt.Println("tcp服务端开始处理请求...") //读取 buffer := make([]byte, 1024) //如果客户端无数据则会阻塞 c.Read(buffer) //输出buffer c.Write(buffer) fmt.Println("tcp服务端开始处理请求完毕...") }
客户端完整编码:
package main import ( "net" "fmt" ) func main() { //net.dial 拨号 获取tcp连接 conn, err := net.Dial("tcp", "127.0.0.1:65535") if err != nil { fmt.Println(err) return } fmt.Println("获取127.0.0.1:65535的tcp连接成功...") defer conn.Close() //需要放在read前面,输出到服务端,否则服务端阻塞 conn.Write([]byte("echo data to server ,then to client!!!")) //读取到buffer buffer := make([]byte, 1024) conn.Read(buffer) fmt.Println(string(buffer)) }
相关文章推荐
- 利用TCP和UDP协议,实现基于Socket的小聊天程序
- 【Qt点滴】UDP协议实例:简易广播实现
- TCP和UDP协议的对比,TCP三次握手,TIME_WAIT状态极其存在的必要性
- QQ使用了什么通讯协议?为什么要这样做?为什么采用 UDP 协议,而不采用 TCP 协议实现?
- golang实现简单的udp协议服务端与客户端示例
- (TCP-over-UDP library):基于UDP协议之上实现通用、可靠、高效的TCP协议 ---------- 转
- TCP上的协议以及UDP上的协议
- Android实现基于TCP和UDP协议的即时通讯,含android端和服务器端
- 使用C#实现基于TCP和UDP协议的网络通信程序的基本示例
- TCP和UDP协议的对比
- IPVS源代码分析---tcp和udp协议实现
- Java基于socket服务实现UDP协议的方法
- (TCP-over-UDP library)基于UDP协议之上实现通用、可靠、高效的TCP协议
- 详解TCP协议的服务特点以及连接建立与终止的过程(俗称三次握手四次挥手)
- TDP(TCP-over-UDP library):基于UDP协议之上实现
- [golang]GO语言编写的基于UDP协议的简易聊天软件
- Android实现基于TCP和UDP协议的即时通讯,含android端和服务器端
- QQ使用了什么通讯协议?为什么要这样做?为什么采用 UDP 协议,而不采用 TCP 协议实现?
- Network——Socket网络通信机制以及实现举例(TCP、UDP等)
- Golang的TCP和UDP实现