ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

go socket编程

2022-07-10 14:02:05  阅读:159  来源: 互联网

标签:socket 编程 TCP tcp func error go 连接 conn


go socket编程

image

  • DMA:网卡和磁盘数据拷贝到内存流程比较固定,不涉及到运算操作,且非常耗时。在磁盘嵌入一个DMA芯片,完成上述拷贝工作,把CPU解脱出来,让CPU专注于运算。
  • mmap:用户空间和内核空间映射同一块内存空间,从而达到省略将数据从内核缓冲区拷贝到用户空间的操作,用户空间通过映射直接操作内核缓冲区的数据。
阻塞式网络I/O

image

非阻塞式网络I/O

image

多路复用网络I/O

image

socket把复杂的传输层协议封装成简单的接口,使应用层可以像读写文件一样进行网络数据的传输

image

socket通信过程

image

1.1 TCP CS架构

1.1.1 网络通信模型

image

1.1.2 传输层数据大小的上限为MSS(Maximum Segment Size, 最大分段大小),网络接口层数据大小的上限为MTU(Maximum Transmit Unit, 最大传输单元)。

image
image

1.1.3 TCP首部

image
如图,TCP选项最多可以有10行,最多也就是40B字节,加上前面的20,最多一共60B,20~60B

  • 前20个字节是固定的,后面还4N个可选字节(TCP选项)。
  • 数据偏移:TCP数据部分距TCP开头的偏移量(一个偏移量是4个字节, TCP选项占4N个字节),亦即TCP首部的长度。所以TCP首部的最大长度是15*4=60个字节,即TCP选项最多有40个字节。
  • 端口在tcp层指定,ip在IP层指定。端口占2个字节,则最大端口号为2^16-1=65535。
  • 由于应用层的数据被分段了,为了在接收端对数据按顺序重组,需要为每段数据编个“序号”。
  • TCP规定在连接建立后所有传送的报文段都必须把ACK设置为1。

1.1.4 TCP建立连接

所谓的三次握手,四次挥手,就是每次发送一个tcp报文
每次发送tcp首部,tcp数据部分不发送

image

  • 第一次握手:TCP首部SYN=1,初始化一个序号=J。SYN报文段不能携带数据。
  • 第二次握手:TCP首部SYN=1,ACK=1,确认号=J+1,初始化一个序号=K。此报文同样不携带数据。
  • 第三次握手:SYN=1,ACK=1,序号=J+1,确认号=K+1。此次一般会携带真正需要传输的数据。
  • 确认号:即希望下次对方发过来的序号值。
  • SYN Flood 攻击始终不进行第三次握手,属于DDOS攻击的一种。

1.1.5 TCP释放连接 四次挥手

image

image

  • TCP的连接是全双工(可以同时发送和接收)的连接,因此在关闭连接的时候,必须关闭传送和接收两个方向上的连接。
  • 第一次挥手:FIN=1,序号=M。
  • 第二次挥手:ACK=1,序号=M+1。
  • 第三次挥手:FIN=1,序号=N。
  • 第四次挥手:ACK=1,序号=N+1。
  • 从TIME_WAIT进入CLOSED需要经过2个MSL(Maxinum Segment Lifetime),RFC793建议MSL=2分钟。

1.1.6 Go TCP编程

  • 用三元给(ip地址,协议,端口号)唯一标示网络中的一个进程,如(172.122.121.111, tcp, 5656)。
  • IPv4的地址位数为32位,分为4段,每段最大取值为255。
  • IPv6的地址位数为128位,分为8段,各段用16进制表示,最大取值为ffff。
  • 端口:01023被熟知的应用程序占用(普通应用程序不可以使用),4915265535客户端程序运行时动态选择使用。
func ResolveTCPAddr(net, addr string) (*TCPAddr, os.Error)
  • net参数是“tcp4”、“tcp6”、“tcp”中的任意一个,分别表示TCP(IPv4-only),TCP(IPv6-only)或者TCP(IPv4,、IPv6的任意一个)。
  • addr表示域名或者IP地址,例如" www.qq.com:80" 或者"127.0.0.1:22"。
func DialTCP(network string, laddr, raddr *TCPAddr) (*TCPConn, error)
  • network参数是"tcp4"、"tcp6"、"tcp"中的任意一个。
  • laddr表示本机地址,一般设置为nil。
  • raddr表示远程的服务地址。
func net.DialTimeout(network string, address string, timeout time.Duration) (net.Conn, error)
  • timeout time.Duration 创建连接时设置超时时间。
func (*net.conn) Write(b []byte) (int, error)
  • 通过conn发送数据。
func (net.Conn).Read(b []byte) (n int, err error)
  • 从conn里读取数据,如果没有数据可读,会阻塞
func ioutil.ReadAll(r io.Reader) ([]byte, error)
  • 从conn中读取所有内容,直到遇到error(比如连接关闭)或EOF
func ListenTCP(network string, laddr *TCPAddr) (*TCPListener, error)
  • 监听端口
func (l *TCPListener) Accept() (Conn, error)
  • 阻塞,直到有客户端请求建立连接
func (*net.conn) Close() error
  • 关闭连接
    连接关闭后,再调用conn.Write()和conn.Read()会返回fatal error
    对方关闭连接后,再在conn上调用Write可能会报错"broken pipe"也可能不会,跟tcp缓冲区情况有关
    对方关闭连接后,再在conn上调用Read会报错"EOF"
func (c *TCPConn) SetReadDeadline(t time.Time) error 
func (c *TCPConn) SetWriteDeadline(t time.Time) error
  • 设置从一个tcp连接上读取和写入的超时时间
func (c *TCPConn) SetKeepAlive(keepalive bool) os.Error
  • 当一个tcp连接上没有数据时,操作系统会间隔性地发送心跳包,如果长时间没有收到心跳包会认为连接已经断开

2.1 tcp

标签:socket,编程,TCP,tcp,func,error,go,连接,conn
来源: https://www.cnblogs.com/liwenchao1995/p/16463073.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有