您当前的位置:首页 > 电脑百科 > 程序开发 > 移动端 > Android

Android网络编程-TCP/IP协议

时间:2019-09-18 09:48:07  来源:  作者:

Android网络编程-计算机网络基础一文中得知,IP协议属于网络层,TCP、UDP协议属于传输层。

IP协议是TCP/IP协议族的动力,它为上层协议提供无状态、无连接、不可靠的服务。

TCP协议是面向连接的传输层协议,提供一种面向连接的、可靠的字节流服务。

UDP协议是面向无连接的传输层协议,提供面向事务的简单不可靠信息传输服务。

数据报文

在不同层传输的数据单位名称不同,在网络层传输的叫数据报,在传输层传输的叫报文段。

IP数据报

IP数据报格式如下图:

Android网络编程-TCP/IP协议

 

IP数据报

各个字段的详细说明:名称长度说明版本4bitIP协议的版本,目前的IP协议版本号为4,下一代IP协议版本号为6首部长度4bitIP报头的长度,最大长度60字节(15*4),<br>分为固定部分的长度(20字节)和可变部分的长度服务类型8bitType Of Service总长度16bitIP报文的总长度。数据报的最大长度为 65535 字节标识16bit它是一个计数器,用来产生数据报的标识。<br>当IP报文长度超过传输网络的MTU(最大传输单元)时必须分片,<br>此标识表示同一个数据报的分片。标志3bitR、DF、MF三位,目前只有后两位有效。<br>DF位:为1表示不分片,为0表示分片。<br>MF:为1表示“更多的片”,为0表示这是最后一片。片偏移13bit本分片在原先数据报文中相对首位的偏移位。<br>片偏移以8个字节为偏移单位。生存时间8bitTTL (Time To Live)表示数据报在网络中的寿命,其单位为秒。<br>在目前的实际应用中,常以“跳”为单位。协议8bit指出IP报文携带的数据使用的哪种协议,<br>以便目的主机的IP层能知道要将数据报上交到哪个进程。<br>TCP的协议号为6,UDP的协议号为17。<br>ICMP的协议号为1,IGMP的协议号为2.首部校验和16bit计算IP头部的校验和,检查IP报头的完整性。源地址32bit标识IP数据报的源端设备。目的地址32bit标识IP数据报的目的地址。可选字段长度可变1~40 字节,用于增加IP数据报的控制功能。填充保证IP首部长度是4字节的整倍数

TCP报文

Android网络编程-TCP/IP协议

 

TCP报文

名称长度说明源端口16bit数据发送方的端口号目的端口16bit数据接受方的端口号序号32bit本数据报文中的的第一个字节的序号<br>(在数据流中每个字节都对应一个序号)确认号32bit希望收到的下一个数据报文中的第一个字节的序号数据偏移4bit表示本报文数据段距离报文段有多远保留字段6bit保留为今后使用,但目前应置为0紧急比特URG当值为1时表示次报文段中有需要紧急处理确认比特ACK值为1时确认号有效,值为0时确认号无效复位比特RST值为1时表示TCP连接存在严重的错误,需要重新进行连接同步比特SYN值为1表示这是一个连接请求或连接接受报文终止比特FIN值为1表示要发送的数据报已经发送完毕,需要释放传送连接窗口16bitTCP连接的一端根据缓存空间的大小来确定自己接受窗口的大小<br>限制发送放的窗口上限检验和16bit用来检验首部和数据两部分的正确性紧急指针字段16bit紧急指针指出在本报文段中的紧急数据的最后一个字节的序号选项字段长度可变TCP 首部可以有多达40字节的可选信息,<br>用于把附加信息传递给终点,或用来对齐其它选项

UDP报文

相对于TCP报文,UDP报文简单了很多。

Android网络编程-TCP/IP协议

 

UDP报文

名称长度说明源端口16bit数据发送方的端口号目的端口16bit数据接受方的端口号包长度16bitUDP首部的长度和数据的长度之和。单位为字节校验和16bit用来检验首部和数据两部分的正确性

TCP三次握手和四次挥手

TCP用三次握手来创建连接,使用四次分手来释放连接。

Android网络编程-TCP/IP协议

 

三次握手

三次握手

三次握手的目的是同步连接双方的序列号和确认号并交换TCP窗口大小的信息。

握手过程:

  • 第一次握手:建立连接,客户端先发送连接请求报文,将SYN设置为1,Sequence Number为x。客户端进入SYN+SEND状态,等待服务器确认。
  • 第二次握手:服务器收到SYN报文。服务器收到客户端的SYN报文,需要对这个SYN报文进行确认,设置Acknowledgment Number为x+1(Sequence+1);同时,自己还要送法SYN消息,将SYN位置为1,Sequence Number为y;服务器将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN+RECV状态。
  • 第三次握手:客户端收到服务器的 SYN+ACK报文段。然后将Acknowlegment Number设为y+1,向服务器发送ACK报文段,这个报文段发送完毕后,客户端端服务器都进入ESTABLISHED状态,完成TCP三次握手。

完成了三次握手,客户端和服务器就可以开始传送数据了。

四次挥手

当客户端和服务端传输数据完毕后,需要断开TCP连接。TCP断开的过程,就是四次挥手。

  • 第一次挥手:客户端(也可以是服务器),设置Sequence Number和Acknowledgment Number,向服务器发送一个FIN报文段。此时客户端进入FIN_WAIT_1状态;这表示客户端没有数据发送给主机了。
  • 第二次挥手:服务器收到客户端发来的FIN报文段,向客户端回一个ACK报文段,Acknowledgement Number为Sequence Number加1;客户端进入FIN_WAIT_2状态,服务器进入CLOSE_WAIT状态;服务器告诉客户端,我同意你的”关闭”请求。
  • 第三次挥手:服务器向客户端发送FIN报文段,请求关闭连接,同时服务器进入LAST_ACK状态。
  • 第四次挥手:客户端收到服务器发送的FIN报文段,向主机发送ACK报文段,然后客户端进入TIME_WAIT状态,服务器收到客户端的ACK报文段以后,就关闭连接,此时,客户端等待2MSL后一次没有到收到回复,则证明服务端已正常关闭,那好,客户端也可以关闭连接了。

TCP三次握手的必要性

防止服务器端因接收了早已失效的连接请求报文,从而一直等待客户端请求,最终导致形成死锁、浪费资源。

TCP四次挥手的必要性

为了保证通信双方都能通知对方,需释放、断开连接。

为什么客户端关闭连接前要等待2MSL时间

MSL: 最大报文段生存时间

四个报文发送完毕后,就可以直接进入CLOSE状态了,但是有可能网络是不可靠的,一切都可能发生,比如有可能最后一个ACK丢失。所以TIME_WAIT状态是用来重发可能丢失的ACK报文。展开具体来讲:

  • 为了保证客户端发送的最后1个连接释放确认报文 能到达服务器,从而使得服务器能正常释放连接。
  • 防止早已失效的连接请求报文,出现在本连接中。客户端发送了最后1个连接释放请求确认报文后,再经过2MSL时间,则可使本连接持续时间内所产生的所有报文段都从网络中消失。

TCP、UDP比较

TCPUDP可靠性可靠不可靠连接性面向连接无连接报文面向字节流面向报文效率低效高效双工性全双工一对一,一对多,多对一,多对多<br>支持多播和广播流量控制滑动窗口机制拥塞控制慢开始/拥塞避免<br>快重传/快恢复传输速度慢快应用场景效率要求相对低,准确要求相对高。<br>要求有连接的场景效率要求相对高,准确要求相对低应用SMTP,TELNET,HTTP,FTPDNS,RIP,NFS,SNMP,<br>IP电话,流媒体

参考

  • 计算机网络:这是一份全面 & 详细 的TCP协议攻略
  • 《图解TCP/IP》读书笔记
  • Android网络编程:基础理论汇总


Tags:Android 网络编程   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
在Android网络编程-计算机网络基础一文中得知,IP协议属于网络层,TCP、UDP协议属于传输层。IP协议是TCP/IP协议族的动力,它为上层协议提供无状态、无连接、不可靠的服务。TCP协...【详细内容】
2019-09-18  Tags: Android 网络编程  点击:(207)  评论:(0)  加入收藏
▌简易百科推荐
今天面试遇到同学说做过内存优化,于是我一般都会问那 Bitmap 的像素内存存在哪?大多数同学都回答在 java heap 里面,就比较尴尬,理论上你做内存优化,如果连图片这个内存大户内存...【详细内容】
2021-12-23  像程序那样思考    Tags:Android开发   点击:(8)  评论:(0)  加入收藏
Android logcat日志封装logcat痛点在Android开发中使用logcat非常频繁,logcat能帮我们定位问题,但是在日常使用中发现每次使用都需要传递tag,并且会遇到输出频率很高的log,在多...【详细内容】
2021-12-22  YuCoding    Tags:Android   点击:(8)  评论:(0)  加入收藏
对项目的基本介绍 1.整个框架主要是给MVVM框架使用的,自己写完interface接口后,通过自定义的注解就能自动生成接口方法 2.用Kotlin的Flow去代替Rxjava,因为我发现RxJava功能很...【详细内容】
2021-12-08  网易Leo    Tags:Android开发   点击:(17)  评论:(0)  加入收藏
前言在Android开发过程中,有些时候会根据需要引用别的项目到当前项目里面,而且以Module形式引用。所以本篇博文就来分享一下怎么以Module形式引用别的项目到当前项目中,方便开...【详细内容】
2021-12-07  网易Leo    Tags:Android开发   点击:(22)  评论:(0)  加入收藏
作者:fundroid这篇文章偏阅读一些,大家可以了解下 Android 的一些最新动向。每年9/10月份 Google 都会举行约为期2天的 Android Dev Summit,在活动上 Google 的技术专家们会分...【详细内容】
2021-11-30  像程序那样思考    Tags:Android开发   点击:(15)  评论:(0)  加入收藏
一、 准备工作1、安装JDK,下载地址(可能需要一个oracle账号,大家百度一下或者自行注册一个就行。尽可能选择8或者11,这两个是长期版本)Java SE | Oracle Technology Network | Or...【详细内容】
2021-11-23  永沧    Tags:Android   点击:(28)  评论:(0)  加入收藏
使用Maven Publish Plugin插件。(官方支持)一、在Library的build.gradle中配置plugins { id &#39;com.android.library&#39; id &#39;kotlin-android&#39; id &#39;k...【详细内容】
2021-11-05  羊城小阳    Tags:Android   点击:(37)  评论:(0)  加入收藏
谷歌离推出Play Store应用程序的新数据隐私部分又近了一步。应用程序开发人员现在可以通过谷歌在Play控制台的新 "数据安全表 "填写相关细节。该公司表示,所需信息将从2022年...【详细内容】
2021-10-20    中关村在线  Tags:安卓   点击:(58)  评论:(0)  加入收藏
架构究竟是什么?如何更好的理解架构?我们知道一个APP通常是由class组成,而这些class之间如何组合,相互之间又如何产生作用,就是影响这个APP的关键点。细分的话我们可以将其分为类...【详细内容】
2021-09-17  像程序那样思考    Tags:Android架构   点击:(52)  评论:(0)  加入收藏
概述当Android应用程序需要访问设备上的敏感资源时,应用程序开发人员会使用权限模型。虽然该模型使用起来非常简单,但开发人员在使用权限时容易出错,从而导致安全漏洞。本文中,...【详细内容】
2021-09-07  SecTr安全团队    Tags:Android开发   点击:(66)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条