网络通信2:TCP简单通信

栏目: 服务器 · 发布时间: 6年前

内容简介:版权声明:本文为博主尹成联系QQ77025077,微信18510341407原创文章,欢迎转载侵权不究。 https://blog.csdn.net/yincheng01/article/details/84136059

版权声明:本文为博主尹成联系QQ77025077,微信18510341407原创文章,欢迎转载侵权不究。 https://blog.csdn.net/yincheng01/article/details/84136059

#首部格式

图释:

网络通信2:TCP简单通信

各个段位说明:

  • 源端口和目的端口:各占 2 字节.端口是传输层与应用层的服务接口.传输层的复用和分用功能都要通过端口才能实现
  • 序号:占 4 字节.TCP 连接中传送的数据流中的每一个字节都编上一个序号.序号字段的值则指的是本报文段所发送的数据的第一个字节的序号
  • 确认号:占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号
  • 数据偏移/首部长度:占 4 位,它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远.“数据偏移”的单位是 32位字(以 4 字节为计算单位)
  • 保留:占 6 位,保留为今后使用,但目前应置为 0
  • 紧急URG:当 URG=1 时,表明紧急指针字段有效.它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)
  • 确认ACK:只有当 ACK=1 时确认号字段才有效.当 ACK=0 时,确认号无效
  • PSH(PuSH):接收 TCP 收到 PSH = 1 的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付
  • RST (ReSeT):当 RST=1 时,表明 TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接
  • 同步 SYN:同步 SYN = 1 表示这是一个连接请求或连接接受报文
  • 终止 FIN:用来释放一个连接.FIN=1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接
  • 检验和:占 2 字节.检验和字段检验的范围包括首部和数据这两部分.在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部
  • 紧急指针:占 16 位,指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)
  • 选项:长度可变.TCP 最初只规定了一种选项,即最大报文段长度 MSS.MSS 告诉对方TCP:“我的缓存所能接收的报文段的数据字段的最大长度是 MSS 个字节.” [MSS(Maximum Segment Size)是TCP 报文段中的数据字段的最大长度.数据字段加上 TCP 首部才等于整个的 TCP 报文段]
  • 填充:这是为了使整个首部长度是 4 字节的整数倍
  • 其他选项:
    (1).窗口扩大:占 3 字节,其中有一个字节表示移位值 S.新的窗口值等于TCP 首部中的窗口位数增大到(16 + S),相当于把窗口值向左移动 S 位后获得实际的窗口大小
    (2).时间戳:占10 字节,其中最主要的字段时间戳值字段(4字节)和时间戳回送回答字段(4字节)
    (3).选择确认:接收方收到了和前面的字节流不连续的两2字节.如果这些字节的序号都在接收窗口之内,那么接收方就先收下这些数据,但要把这些信息准确地告诉发送方,使发送方不要再重复发送这些已收到的数据
    #数据单位
    TCP 传送的数据单位协议是 TCP 报文段(segment)
    #特点
    TCP 是面向连接的传输层协议 每一条 TCP 连接只能有两个端点(endpoint),每一条 TCP 连接只能是点对点的(一对一) TCP 提供可靠交付的服务 TCP 提供全双工通信 面向字节流
    #实例
    ###服务端实现
import (
	"fmt"
	"net"
	"os"
)

func CheckErrorS(err error){
	if  err !=nil{
		fmt.Println("网络错误",err.Error())
		os.Exit(1)
	}
}

func  Processinfo(conn net.Conn){
	buf :=make([]byte,1024)//开创缓冲区
	defer conn.Close() //关闭连接

	//与客户端源源不断地IO
	for{
		n,err:=conn.Read(buf) //读取数据
		if err !=nil{
			break
		}

		if n !=0{
			msg := string(buf[:n])
			fmt.Println("收到消息",msg)
			conn.Write([]byte("已阅:"+msg))

			if msg=="分手吧"{
				break
			}
		}
	}

}

func main() {
	//建立TCP服务器
	listener,err:=net.Listen("tcp","127.0.0.1:8898")
	defer listener.Close() //关闭网络
	CheckErrorS(err)

	//循环接收,来者不拒
	for  {
		//接入一个客户端
		conn,err:= listener.Accept() //新的客户端连接
		CheckErrorS(err)

		//为每一个客户端开一条独立的协程与其IO
		go  Processinfo(conn)
	}


}

###客户端实现

import (
	"fmt"
	"net"
	"os"
	"bufio"
)

func CheckErrorC(err error){
	if  err !=nil{
		fmt.Println("网络错误",err.Error())
		os.Exit(1)
	}
}

func main() {
	conn,err :=net.Dial("tcp","127.0.0.1:8898")//建立TCP服务器
	defer conn.Close() //延迟关闭网络连接
	CheckErrorC(err)//检查错误

	//创建一个黑窗口(标准输入)的读取器
	reader := bufio.NewReader(os.Stdin)
	buffer := make([]byte, 1024)

	for{
		lineBytes, _, err := reader.ReadLine()
		CheckErrorC(err)
		conn.Write(lineBytes)
		fmt.Println("发送消息")

		/*接收消息*/
		n, err := conn.Read(buffer)
		CheckErrorC(err)

		msg := string(buffer[:n])
		fmt.Println("收到服务端消息:",msg)
	}


}

学院 Go 语言视频主页

https://edu.csdn.net/lecturer/1928

[清华团队带你实战区块链开发]

( https://ke.qq.com/course/344443?tuin=3d17195d )

扫码获取海量视频及源码 QQ群:721929980

网络通信2:TCP简单通信

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

高效能程序员的修炼

高效能程序员的修炼

[美]Jeff Atwood / 陆其明、张健 / 人民邮电出版社 / 2013-7 / 49

jeff atwood于2004年创办coding horror博客(http://www.codinghorror.com),记录其在软件开发经历中的所思所想、点点滴滴。时至今日,该博客每天都有近10万人次的访问量,读者纷纷参与评论,各种观点与智慧在那里不断激情碰撞。 《高效能程序员的修炼》是coding horror博客中精华文章的集合。全书分为12章,涉及迈入职业门槛、高效能编程、应聘......一起来看看 《高效能程序员的修炼》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具