文档章节

深入浅出--iOS的TCP/IP协议族剖析&&Socket

DANNY1024
 DANNY1024
发布于 2017/05/08 15:58
字数 3199
阅读 1
收藏 0
点赞 0
评论 0

简介

该篇文章主要回顾--TCP/IP协议族中的TCP/UDP、HTTP;还有Socket。(--该文很干,酝酿了许久!你能耐心看完吗?)

我在这个文章中,列举了常见的TCP/IP族中的协议,今天主角是--传输层协议。

传输层(Transport Layer)是OSI(七层模型)中最重要、最关键的一层,它负责总体的数据传输和数据控制的一层,传输层提供端到端(应用会在网卡注册一个端口号)的交换数据的机制,检查分组编号与次序。传输层对其上三层如会话层等,提供可靠的传输服务,对网络层提供可靠的目的地站点信息。

传输层中的协议

  • 传输层它为应用层提供会话和数据报通信服务。

  • 传输层承担OSI传输层的职责。

  • 传输层的核心协议是TCP和UDP。

TCP提供一对一的、面向连接的可靠通信服务。TCP建立连接,对发送的数据包进行排序和确认,并恢复在传输过程中丢失的数据包。与TCP不同,UDP提供一对一或一对多的、无连接的不可靠通信服务。

不论是TCP/IP还是在OSI参考模型中,任意相邻两层的下层为服务提供者,上层为服务调用者。下层为上层提供的服务可分为两类:面向连接服务和无连接服务。

  • 面向连接的网络服务

面向连接的网络服务又称为虚电路(Virtual Circuit)服务,它具有网络连接建立、数据传输和网络连接释放三个阶段。是按顺序传输可靠的报文分组方式,适用于指定对象、长报文、会话型传输要求。

面向连接服务以电话系统为模式。要和某个人通话,首先拿起电话,拨号码,通话,然后挂断。同样在使用面向连接的服务时,用户首先要建立连接,使用连接,然后释放连接。连接本质上像个管道:发送者在管道的一端放入物体,接收者在另一端按同样的次序取出物体;其特点是收发的数据不仅顺序一致,而且内容也相同。--类似打电话

  • 无连接的网络服务

无连接网络服务的两实体之间的通信不需要事先建立好一个连接。无连接网络服务有3种类型:数据报(Datagram)、确认交付(Confirmed Delivery)与请求回答(Request reply)。

无连接服务以邮政系统为模式。每个报文(信件)带有完整的目的地址,并且每一个报文都独立于其他报文,由系统选定的路线传递。在正常情况下,当两个报文发往同一目的地时,先发的先到。但是,也有可能先发的报文在途中延误了,后发的报文反而先收到;而这种情况在面向连接的服务中是绝对不可能发生的。--类似发短信

传输控制协议(TCP)

1.TCP全称是Transmission Control Protocol,中文名为传输控制协议,它可以提供可靠的、面向连接的网络数据传递服务。传输控制协议主要包含下列任务和功能:

2.确保IP数据报的成功传递。

  • 对程序发送的大块数据进行分段和重组。

  • 确保正确排序及按顺序传递分段的数据。

  • 通过计算校验和,进行传输数据的完整性检查。

  • 根据数据是否接收成功发送肯定消息。通过使用选择性确认,也对没有收到的数据发送否定确认。

为必须使用可靠的、基于会话的数据传输程序,如客户端/服务器数据库和电子邮件程序,提供首选传输方法。

3.TCP工作原理

TCP的连接建立过程又称为TCP三次握手:

  • 首先发送方主机向接收方主机发起一个建立连接的同步(SYN)请求;

  • 接收方主机在收到这个请求后向发送方主机回复一个同步/确认(SYN/ACK)应答;

  • 发送方主机收到此包后再向接收方主机发送一个确认(ACK),此时TCP连接成功建立.

一旦初始的三次握手完成,在发送和接收主机之间将按顺序发送和确认段。关闭连接之前,TCP使用类似的握手过程验证两个主机是否都完成发送和接收全部数据。

完成三次握手,客户端与服务器开始传送数据。

三次握手示意图:

1156719-c5842e3714145b94.png

三次握手.png

 

TCP 工作过程比较复杂

TCP关闭时:发送放主机会向目的方主机发送一个带有结束标记 1 的数据包,并关闭此链接,并释放该链接占用的缓冲空间内存

TCP重置:TCP允许在传输过程中突然中断

TCP数据排序和确认:在传输的过程中使用序列号和确认号来跟踪数据的接收情况

TCP重传:在TCP 的传输过程中,如果在重传时间内没有收到接受方的回应那么发送方就会认为此数据丢失发送方就会重新发送此条数据

TCP延迟确认:TCP并不是在接受到数据后立即对其确认

 

用户数据报协议(UDP)

全称:User datapragm protocol 用户数据报协议 UDP提供无连接的网络数据服务,该服务对消息中传输的数据提供不可靠的,尽最大努力的传输,它不保证数据报的到达也不保证数据包顺序的正确性

UDP有着TCP 没有的速度优势

 

TCP与端口号

TCP和UDP都是IP层面的传输协议,是IP与上层之间的处理接口。TCP和UDP端口号被设计来区分运行在单个设备上的多重应用程序的IP地址。由于同一台计算机上可能会运行多个网络应用程序,所以计算机需要确保目标计算机上接收源主机数据包的软件应用程序的正确性,以及响应能够被发送到源主机的正确应用程序上。该过程正是通过使用TCP或UDP端口号来实现的。

--即每一个应用都会在网卡上注册一个端口号用来区分同一台设备上应用的之间的通信

在TCP和UDP头部分,有“源端口”和“目标端口”段,主要用于显示发送和接收过程中的身份识别信息。IP 地址和端口号合在一起被称为“套接字”。TCP端口比较复杂,其工作方式与UDP端口不同。UDP端口对于基于UDP的通信作为单一消息队列和网络端点来操作,而所有TCP通信的终点都是唯一的连接。每个TCP连接由两个端点唯一识别。由于所有TCP连接由两对 IP 地址和TCP端口唯一识别(每个所连主机都有一个地址/端口对),因此每个TCP服务器端口都能提供对多个连接的共享访问

再看一下IP数据包和TCP/UDP的数据包

1156719-749d23000ec36f87.png

数据包.png

 

 

HTTP协议

一个完整的HTTP协议包含“请求行” “请求头” “请求体”

请求行:包含请求方法 请求资源路径

请求头:包含了对客户端的环境描述,客户端请求的主机地址等信息

请求体:客户端发给服务器的具体数据(比如文件图片等)

 

发送HTTP请求

在ios中发送HTTP请求的方法有很多

1.ios原生:NSURLConnection

2.NSURLSession,ios7后推出的技术比NSURLConnection更强大

第三方框架

AFNetworking(oc)       alamofire(swift)

 

HTTP方法

http协议定义了很多方法对应不同的资源操作,其中最常用的是GET和POST方法。

eg:GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT、PATCH

增:PUT

删:DELETE

改:POST

查:GET

因为GET和POST可以实现上述所有操作,所以,在现实开发中,GET和POST方法使用的最为广泛,除此以外HEAD请求使用频率也比较高;

  • GET

在请求URL后面以?的形式跟上发给服务器的参数,参数以"参数名"="参数值"的形式拼接,多个参数之间用&分隔;

GET的本质是从服务器得到数据,效率更高.并且GET请求可以被缓存.

注意:GET的长度是有限制的,不同的浏览器有不同的长度限制,一般在2~8K之间;

  • POST

POST的本质是向服务器发送数据,也可以获得服务器处理之后的结果,效率不如GET.POST请求不可以被缓存,每次刷新之后都需要重新提交表单.

发送给服务器的参数全部放在'请求体'中;

理论上,POST传递的数据量没有限制.

注意:所有涉及到用户隐私的数据(密码/银行卡号等...)都要用POST的方式传递.

 

Socket

Socket 简介

  • Socket起源于 20 世 纪 80 年代早期,最早由 4.1c BSD UNIX 引入,所以也称之为“BSD Socket 或者 Berkeley Socket”。BSD Socket 是事实上的网络应用编程接口标准,其它编程语言往往也是用与这套(用C写成的编程接口)类似接口。

  • 用 Socket 能够实现网络上的不同主机之间或同一主机的不同对象之间的数据通信。所以,现在 Socket 已经是一类通用通信接口的集合。

大的类型可以分为网络 Socket 和本地 Socket 两种。

本地上的两个进程如何通信?

  • 内存共享(munmap());

  • 消息和队列;

  • 管道(匿名管道pipe()和命名管道mkfifo());

  • 信号量(P V操作);

  • RPC remote protocol control

  • 本地Socket;

网路上的两个进程如何通信?

本地进程间通信(IPC)通过PID(在终端中输入ps -ef可查看PID)可以唯一确定彼此,然后通过共享内存,消息队列来通;网络上的两个进程确定彼此需要IP与端口号,通过传输层(TCP/UDP)协议进行通信;

网路socket和 本地 Socket对比

  • 在同一个设备上,两个进程如果需要进行通讯最基本的一个前提能能够唯一的标示一个进程,在本地进程通讯中可以使用PID来唯一标示一个进程;

  • PID只在本地唯一,网络中的两个进程PID冲突几率很大,此时显然不行了,怎么办?

IP层的ip地址可以唯一标示主机,而TCP层协议和端口号可以唯一标示主机的一个进程,所以可以利用ip地址+协议+端口号唯一标示网络中的一个进程。

Socket通信就是一种确定了端口号的TCP/IP通信,或者说Socket通信与IP通信差别就是端口确定,协议确定。

用一张图表达一下:

1156719-5ab11b14ed460183.png

Socket.png

端口的打开是双方的,在C/S(Client&&Server)结构的TCP连接中不仅仅要注意到S的端口(监听的),实际上C也开了一个端口,而C端的端口是动态端口,TCP连接建立的时候,C端的端口会在三次握手结束后确定,动态打开一个,这个端口不受用户/程序员的控制。

Socket C 端书写步骤

  • 创建客户端Socket

  • 创建服务器Socket

  • 连接到服务器(Socket编程)

  • 发送数据给服务器

  • 接收服务器返回的数据

  • 关闭Socket : close(socketNumber)

一张经典的Socket C/S的步骤图。

1156719-f11be16e57524586.jpg

Socket.jpg

QQ截图20160218155057.png

按照上面步骤就可以写一个socket的通信的小demo:

写好的已经放在了我的github

此时没有写服务端,怎么测试?

可利用:nc -lk 端口号:始终监听本地计算机此端口的数据。

eg:nc -lk 6666;

操作步骤gif

  1. 监听 6666端口

  2. connettion;

  3. 发送socket;服务器接收到socket;

  4. 服务端send :hello socket;

1156719-34b7d082f0b3617c.gif

操作步骤.gif

S端socket通信步骤

  1. 提供一些服务

  2. 将这个服务与自己的IP地址、端口绑定

  3. 监听任何到这个IP+端口的TCP请求

  4. 接受/拒绝建立这个TCP连接

  5. 读写

  6. 断开TCP连接

 

 

© 著作权归作者所有

共有 人打赏支持
DANNY1024
粉丝 0
博文 2
码字总数 4050
作品 0
阿里腾讯百度头条美团iOS面试总结

阿里腾讯百度头条美团iOS面试总结 2018-05-30 15:24编辑: garace分类:程序人生来源:代码湾 互联网面试iOS 招聘信息: C++工程师 Cocos2d-x游戏客户端开发 iOS开发工程师 京东招聘iOS开发工...

garace ⋅ 05/30 ⋅ 0

面试官自述:面向高级开发人员的iOS面试问题

当您准备进行技术性iOS面试时,了解您可能会询问哪些主题以及经验丰富的iOS开发人员期望什么是非常重要的。 这是许多硅谷公司用来衡量iOS候选人资历水平的一系列问题。 这些问题涉及iOS开发的...

菇哒微课 ⋅ 04/26 ⋅ 0

如何判断你是合格的高级iOS开发工程师?

前言 随着移动互联网的高速发展泄洪而来,有意学习移动开发的人越来越多了,竞争也是越来越大,需要学习的东西很多。如何才能在激烈的移动开发者竞争中一枝独秀,成为一名真正合格的高级iOS...

_小迷糊 ⋅ 05/26 ⋅ 0

iOS源码补完计划--AFNetworking 3.1.0源码研读

参拜一下AFNetworking的源码。 第四篇源码、暂时来看也是iOS方向的最后一篇、撸完准备趁着热乎撸一撸网络协议。 目录 准备工作 功能模块 AFURLSessionManager/AFHTTPSessionManager AFNetwo...

kirito_song ⋅ 05/25 ⋅ 0

赛诺:Q1中国智能机销量OPPO居首 华为荣耀分列四五位

赛诺:Q1中国智能机销量OPPO居首 华为荣耀分列四五位 2018-04-24 17:06编辑: 游星啊分类:业界动态来源:新浪科技 智能机智能机市场智能机销量 招聘信息: C++工程师 Cocos2d-x游戏客户端开发...

游星啊 ⋅ 04/24 ⋅ 0

2018 一份"有点难"的iOS面试题(5年iOS开发)

序言: 之前一时兴致在本站上出过一份iOS的中级面试题,引起一些关注,不少同学表示对”隐藏关卡“感兴趣。升级版iOS面试题来了,目测难倒90%iOS程序员,目测一大波程序员撸着袖子在靠近。 ...

原来是泽镜啊 ⋅ 05/26 ⋅ 0

【AR】开始使用Vuforia开发iOS(2)

原 设置iOS开发环境 安装Vuforia iOS SDK 如何安装Vuforia iOS示例 编译并运行Vuforia iOS示例 支持iOS金属 iOS 64位迁移 设置iOS开发环境 适用于iOS的Vuforia引擎目前支持运行iOS 9及更高版...

lichong951 ⋅ 06/11 ⋅ 0

HDU ~ 6297 ~ CCPC直播 (模拟,输出格式控制)

思路:模拟就行了,注意Running和RTE的开头字母一样。 iomanip是I/O流控制头文件,就像printf的格式化输出一样。 以下是一些常用的: dec 置基数为10 相当于"%d" hex 置基数为16 相当于"%X" oc...

zscdst ⋅ 05/29 ⋅ 0

iOS三维菜单、调试工具、封装通讯录、网络框架、多种控件和动画等源码

iOS精选源码 一个调用系统通讯录和获取通讯录所有联系人的封装(http://www.code4app.com/thread-29726-1-1.html) ios scrollview嵌套tableview同向滑动(初级、进阶), 支持OC / Swift(http...

sunnyaigd ⋅ 05/15 ⋅ 0

苹果对体无完肤的 iOS 11 最后的弥补

点击上方“CSDN”,选择“置顶公众号” 关键时刻,第一时间送达! 距离万众瞩目的苹果开发者大会(WWDC 2018)的召开还有不到一周时间,苹果公司于今天凌晨,正式发布了 iOS 11 的第十四次更...

csdnnews ⋅ 05/30 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Centos7重置Mysql 8.0.1 root 密码

问题产生背景: 安装完 最新版的 mysql8.0.1后忘记了密码,向重置root密码;找了网上好多资料都不尽相同,根据自己的问题总结如下: 第一步:修改配置文件免密码登录mysql vim /etc/my.cnf 1...

豆花饭烧土豆 ⋅ 今天 ⋅ 0

熊掌号收录比例对于网站原创数据排名的影响[图]

从去年下半年开始,我在写博客了,因为我觉得业余写写博客也还是很不错的,但是从2017年下半年开始,百度已经推出了原创保护功能和熊掌号平台,为此,我也提交了不少以前的老数据,而这些历史...

原创小博客 ⋅ 今天 ⋅ 0

LVM讲解、磁盘故障小案例

LVM LVM就是动态卷管理,可以将多个硬盘和硬盘分区做成一个逻辑卷,并把这个逻辑卷作为一个整体来统一管理,动态对分区进行扩缩空间大小,安全快捷方便管理。 1.新建分区,更改类型为8e 即L...

蛋黄Yolks ⋅ 今天 ⋅ 0

Hadoop Yarn调度器的选择和使用

一、引言 Yarn在Hadoop的生态系统中担任了资源管理和任务调度的角色。在讨论其构造器之前先简单了解一下Yarn的架构。 上图是Yarn的基本架构,其中ResourceManager是整个架构的核心组件,它负...

p柯西 ⋅ 今天 ⋅ 0

uWSGI + Django @ Ubuntu

创建 Django App Project 创建后, 可以看到路径下有一个wsgi.py的问题 uWSGI运行 直接命令行运行 利用如下命令, 可直接访问 uwsgi --http :8080 --wsgi-file dj/wsgi.py 配置文件 & 运行 [u...

袁祾 ⋅ 今天 ⋅ 0

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

推荐:并发情况下:Java HashMap 形成死循环的原因

在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历...

码代码的小司机 ⋅ 昨天 ⋅ 2

聊聊spring cloud gateway的RetryGatewayFilter

序 本文主要研究一下spring cloud gateway的RetryGatewayFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gateway/config/G......

go4it ⋅ 昨天 ⋅ 0

创建新用户和授予MySQL中的权限教程

导读 MySQL是一个开源数据库管理软件,可帮助用户存储,组织和以后检索数据。 它有多种选项来授予特定用户在表和数据库中的细微的权限 - 本教程将简要介绍一些选项。 如何创建新用户 在MySQL...

问题终结者 ⋅ 昨天 ⋅ 0

android -------- 颜色的半透明效果配置

最近有朋友问我 Android 背景颜色的半透明效果配置,我网上看资料,总结了一下, 开发中也是常常遇到的,所以来写篇博客 常用的颜色值格式有: RGB ARGB RRGGBB AARRGGBB 这4种 透明度 透明度...

切切歆语 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部