linux套接字编程笔记(一)--TCP与UDP

linux套接字编程笔记(一)–TCP与UDP

TCP和UDP是传输层协议,作为传输层协议主要功能如下:

  • 提供建立、维护和拆除传输连接的功能。传输层在网络层的基础上为高层提供“面向连接”和“面向无接连”的两种服务。简单来说就是有连接or无连接
  • 处理传输差错:提供可靠的“面向连接”和不太可靠的“面向无连接”的数据传输服务、差错控制和流量控制。在提供“面向连接”服务时,通过这一层传输的数据将由目标设备确认,如果在指定的时间内未收到确认信息,数据将被重发。简单来说就是传输可靠或不可靠
  • 监控服务质量。

这里面比较常用的主要是TCP/UDP的报文头结构和TCP建立连接、断开连接的握手,下面将会简单介绍。

在看TCP/UDP报文头之前,先来看IP的报文头,毕竟这三个是互相关联的

IP报文头结构

IP报文头的长度通常为20个字节,一般在20到60个字节之间,而一个IP分组的最大长度则不能超过65535个字节。

报文头结构

这里写图片描述

  • 版本:占4位(bit),指IP协议的版本号。目前的主要版本为IPV4,即第4版本号,也有一些教育网和科研机构在使用IPV6。在进行通信时,通信双方的IP协议版本号必须一致,否则无法直接通信。
  • 首部长度:占4位(bit),指IP报文头的长度。最大的长度(即4个bit都为1时)为15个长度单位,每个长度单位为4字节(TCP/IP标准,DoubleWord),所以IP协议报文头的最大长度为60个字节,最短为上图所示的20个字节。
  • 服务类型:占8位(bit),用来获得更好的服务。其中的前3位表示报文的优先级,后面的几位分别表示要求更低时延、更高的吞吐量、更高的可靠性、更低的路由代价等。对应位为1即有相应要求,为0则不要求。
    总长度:16位(bit),指报文的总长度。注意这里的单位为字节,而不是4字节,所以一个IP报文的的最大长度为65535个字节。
  • 标识(identification):该字段标记当前分片为第几个分片,在数据报重组时很有用。
  • 标志(flag):该字段用于标记该报文是否为分片(有一些可能不需要分片,或不希望分片),后面是否还有分片(是否是最后一个分片)。
  • 片偏移:指当前分片在原数据报(分片前的数据报)中相对于用户数据字段的偏移量,即在原数据报中的相对位置。
  • 生存时间:TTL(Time to Live)。该字段表明当前报文还能生存多久。每经过1ms或者一个网关,TTL的值自动减1,当生存时间为0时,报文将被认为目的主机不可到达而丢弃。使用过Ping命令的用户应该有印象,在windows中输入ping命令,在返回的结果中即有TTL的数值。
  • 协议:该字段指出在上层(网络7层结构或TCP/IP的传输层)使用的协议,可能的协议有UDP、TCP、ICMP、IGMP、IGP等。
  • 首部校验和:用于检验IP报文头部在传播的过程中是否出错,主要校验报文头中是否有某一个或几个bit被污染或修改了。
  • 源IP地址:32位(bit),4个字节,每一个字节为0~255之间的整数,及我们日常见到的IP地址格式。
  • 目的IP地址:32位(bit),4个字节,每一个字节为0~255之间的整数,及我们日常见到的IP地址格式。

如何计算校验和,可以参考这篇文章。http://blog.csdn.net/qq_15437667/article/details/51388860

其中,根据个人经验比较常用的是标识、分片标志、生存时间、协议、源地址、目标地址和校验和。当然最少会看目标地址、源地址应该就可以了吧。。

TCP报文头结构

这里写图片描述

  • u32位端口号:源端口和目的端口各占16位,2的16次方等于65536,看端口的命令:netstat。
  • u32位序号:也称为顺序号(Sequence Number),简写为SEQ,
  • u32位确认序号:也称为应答号(Acknowledgment Number),简写为ACK。在握手阶段,确认序号将发送方的序号加1作为回答。
  • u4位首部长度:这个字段占4位,它的单位时32位(4个字节)。本例值为7,TCP的头长度为28字节,等于正常的长度2 0字节加上可选项8个字节。,TCP的头长度最长可为60字节(二进制1111换算为十进制为15,15*4字节=60字节)。
  • u6位标志字段:ACK 置1时表示确认号(为合法,为0的时候表示数据段不包含确认信息,确认号被忽略;RST 置1时重建连接。如果接收到RST位时候,通常发生了某些错误。SYN 置1时用来发起一个连接。FIN 置1时表示发端完成发送任务。用来释放连接,表明发送方已经没有数据发送了。URG 紧急指针,告诉接收TCP模块紧要指针域指着紧要数据。注:一般不使用。PSH 置1时请求的数据段在接收方得到后就可直接送到应用程序,而不必等到缓冲区满时才传送。注:一般不使用。
  • u16位检验和:检验和覆盖了整个的TCP报文段: TCP首部和TCP数据。这是一个强制性的字段,一定是由发端计算和存储,并由收端进行验证。
  • u16位紧急指针:注:一般不使用。
  • u可选与变长选项:通常为空,可根据首部长度推算。用于发送方与接收方协商最大报文段长度(MSS),或在高速网络环境下作窗口调节因子时使用。首部字段还定义了一个时间戳选项。

u最常见的可选字段是最长报文大小,又称为MSS (Maximum Segment Size)。每个连接方通常都在握手的第一步中指明这个选项。它指明本端所能接收的最大长度的报文段。1460是以太网默认的大小。

PS:由于TCP是面向流传输,所以实际上使用tcp socket进行通讯时,需要解决粘包的问题(因为TCP的报文在网络状况不好时,可能不会是一次性把一个完整的包发完,需要校验报文长度)

UDP报文头结构

这里写图片描述

  • u2字节源端口和目的端口字段:源端口是一个大于1023的16位数字,由基于UDP应用程序的用户进程随机选择。
  • u2字节长度字段:指明了包括首部在内的UDP报文段长度。UDP长字段的值是UDP报文头的长度(8字节)与UDP所携带数据长度的总和。
  • u2字节校验和字段:是指整个UDP报文头和UDP所带的数据的校验和(也包括伪报文头)。伪报文头不包括在真正的UDP报文头中,但是它可以保证UDP数据被正确的主机收到了。因在校验和中加入了伪头标,故ICMP除能防止单纯数据差错之外,对IP分组也具有保护作用。

PS:UDP报文校验和处如果填0则不会计算校验和

TCP三次握手建链

TODO

TCP四次握手断链

TODO

如果中间有一个出错怎么办?

TODO

TCP的状态机

TODO

本文牵扯较多具体细节问题,这种用用脑袋就知道我大部分是根据关键字查询的,所以我这里列一下参考资料
IP(其对应wiki百科)
TCP(http://www.360doc.com/content/12/1218/10/3405077_254718387.shtml
UDP

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值