搜公众号
推荐 原创 视频 Java开发 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库
Lambda在线 > Ai网事 > 网络基础(四)TCP、UDP协议

网络基础(四)TCP、UDP协议

Ai网事 2018-09-24
举报

说起TCP、UDP协议,一般都会先讲TCP、UDP协议的区别。而一讲到TCP、UDP协议的区别,我们一般都会像背书一样的说到:TCP协议是面向连接的,UDP协议是无连接的。那么再往下,为什么TCP协议是面向连接的?UDP就是无连接的?TCP、UDP协议哪种比较好?TCP、UDP协议报文的结构,工作的原理是怎样的呢?


会了不难,难了不会,关键是有时会了,过几天又不会了。


为啥?


忘记了!


所以,温故知新,今天就一起温故一下吧。


TCP协议是面向连接的,在数据传输之前,TCP先要在发送方与接收方之间建立一条虚拟连接,然后进行数据传输,数据传输完成以后,TCP关闭这条虚拟连接。




TCP协议有五个服务特征:全双工、点对点、面向字节流、支持数据缓冲和立即发送、提供紧急数据功能。


TCP连接有三个阶段:连接建立、数据传输、连接拆除。


TCP协议的核心就是重传和窗口机制。重传很好理解,就是在指定时间内,如果没有收到接收端返回的收到确认,那么发送端就会进行重发。


窗口分为接受端窗口和发送端窗口,发送端窗口又叫做拥塞窗口。这两者都可以控制传输数据大小,避免拥塞。


网络基础(四)TCP、UDP协议


先看下上面这张TCP头部报文示意图。


最上面一行,画的是一把尺子,尺子的刻度从00到31。这把尺子不是TCP头部的结构,而是画上去用来丈量TCP头部各部分长度的。这把尺子的单位是位(bit),也就是我们说的比特。因为8位=1个字节,所以每一行从左到右的大小是32bit,4个Byte。TCP头部前5行叫做固定部分,最后一行TCP Options叫做可选项,长度是不固定的,其大小在0-40字节之间变化。所以一个TCP 头部有20字节的固定大小,也就是说TCP头部最小为20字节,最大为60字节。

      

总体看完以后,再逐一研究每一个字段的功能。


Source port:源端口号字段,大小为16位,2个字节。


Destination port:目的端口号字段,大小也是16位,2个字节。


源端口、目的端口都是OSI七层模型中传输层的概念,端口其实就是主机不同进程的一个标识。


Sequence Number:序列号,大小为32位,4个字节。因为IP数据包是不可靠的,在传输过程中会出现丢失或者乱序的情况。而TCP报文是封装在IP包头内的,所以接受方在收到TCP报文以后,要根据Sequence Number对TCP报文进行排序重组。


Acknowledgement Number:确认号,大小为32位,4个字节。是接收方对发送方发送过来的数据的确认响应,告知发送方报文已收到,可以发送下一个分组了。如果接收方不回复ACK,那么发送方在计时超时后就会重新发送之前的分组报文。


HL:head length,这个字段本身的大小是4位,用它来表示TCP报头的大小。报头示意图中每一行是4字节,而HL其实是表示报头一共有多少行的。4位可以表示最大的10进制数值是15(8+4+2+1),那么报头最大就会有15行,即60字节。(尽量理解吧,抓包软件中会直接显示数据报头大小的)


网络基础(四)TCP、UDP协议


Flags:12位,包含Reserved、Nonce、CWR、ECN、Urgent、ACK、Push、Reset、Syn、Fin字段。


Reserved:保留位,3位。它的作用就是没作用,只做保留。有的人将Nonce、CWR、ECN一起划分到Reserved中,那么reserved占6位,还有的人单独将Nonce划分到Reserved中,那么Reserved占4位,都不准确,我们看一下wirshark抓包情况。


网络基础(四)TCP、UDP协议

从数据包看Reserved占用3位,其余字段均占用1位,并且都包含在Flags中。


Nonce:用于防止TCP发送者的数据包标记被恶意或者意外改动。


CWR:回传拥塞指示,即指示发送者应减少信息发送量。


ECN-Echo:确认接收到了拥塞指示回应。


以上三位(ECN)是可选项,当ECN被使用时,必须在连接建立时,通过SYN和SYN-ACK段中包含适当选项来协商。


Urgent:Urgent pointer是否有效的标记位,当Urgent为1时,Urgent pointer有效,当Urgent为0时,Urgent pointer无效。(稍后介绍Urgent pointer以及紧急数据的机制)


ACK:确认标志位,置1有效,作用为接收方告知发送方数据已被正常接收。


PUSH:推送标志位,置1有效,正常发送端发送给接收端的数据会被放在接收端的数据缓冲区中,当数据缓冲区满了以后,将数据交给应用层处理。当一段分组数据的PUSH位被发送端置1时,接收端接收后会直接将这段分组数据交由应用层处理,而不是先放到数据缓冲区内。


Reset:连接复位请求,用来复位TCP连接,置1有效。


SYN:TCP建立连接时的握手信号,置1有效。


FIN:双方数据传输完成,发送FIN连接被断开。


Window:接收窗口,大小为16位,2个字节。用来告知发送端自己能接收的数据量,从而达到流量控制的目的。接收端win的大小一定要大于发送端len的大小。


Checksum:TCP校验,大小为16位,用来校验TCP数据的有效性。


Urgent Pointer:与Urgent字段配合使用,当Urgent置1时有效。一般情况下,数据被接收端接收以后,先放在缓存中,待重组后再交给应用层进行处理。而如果是紧急数据,则不进行缓存而直接交给应用层进行处理。Urgent Pointer 就是用来标记哪部分数据属于紧急数据。其紧急数据部分=sequence number+urgent pointer。


TCP options:选项字段,虽然在示意图中只画了一行,但其大小在0-40字节之间,它设定了接收方能够接受的TCP最大载荷能力。缺省为536字节。


UDP相对于TCP,只在IP数据报服务至上增加了很少一点功能,即端口和差错检测,所以UDP的首部开销很小,只有8个字节。

UDP虽然没有TCP有那么多机制对传输服务进行保障,但是UDP却有这非常高效的传输效率。UDP传输之前不需要建立连接,既不保证可靠交付,也没有拥塞控制。因为UDP传输效率高,又支持一对一、一对多、多对一、多对多的交互通信,所以非常适合多媒体的通信要求。



基于TCP和UDP的区别,所以场景要求不同,应用不同。例如同样是文件传输,如果网络质量不能保证,我们会优先选择FTP协议来传输文件。但如果网络质量可靠,我们可能会选择TFTP协议来进行文件传输。另外像一些即时通信的软件,都是采用的UDP协议。而像邮件、HTTP之类的应用则采用TCP协议。


好了,先聊这么多,聊的不好多指教。


如果觉得作者辛苦,请点击一下下方的广告 



版权声明:本站内容全部来自于腾讯微信公众号,属第三方自助推荐收录。《网络基础(四)TCP、UDP协议》的版权归原作者「Ai网事」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

关注Ai网事微信公众号

Ai网事微信公众号:ai_wang4

Ai网事

手机扫描上方二维码即可关注Ai网事微信公众号

Ai网事最新文章

精品公众号随机推荐

举报