网络协议IP、TCP And UDP详解

计算机网络就是用 物理链路 将各个孤立的工作站或主机连接在一起,组成 数据链路,从而达到资源共享和通信的目的。

网络协议

OSI/RM(开放系统互联参考模型)模型将计算机网络体系结构划分为7层。自下而上分别是:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。

  • 应用层:开放系统互联环境的最高层,为操作系统或网络应用程序提供访问网络服务的接口。
  • 表示层:为上层用户提供共同的数据或信息的语法表示转换。为了让采用不同编码方法的计算机在通信中能相互理解数据的内容,可以采用抽象的标准方法来定义数据结构,并采用标准的编码表示形式。表示层管理这些抽象的数据结构,并将计算机内部的表示形式转换成网络通信中采用的标准表示形式。数据压缩和加密也是表示层提供的表示变换的能力。
  • 会话层:主要功能就是组织和同步不同的主机上各种进程间的通信(称为对话),负责在两个会话层实体之间进行对话链接的建立和拆除。
  • 传输层:负责数据传送的最高层次。传输层完成同处于资源子网中的两个主机间的链接和数据传输,也称为端到端的数据传输。
  • 网络层:主要任务就是选择合适的路由,使网络层的数据传输单元(分组)能够正确无误的按照地址找到目的站。
  • 数据链路层:负责在两个相邻的节点间的线路上无差错的传输以帧为单位的数据。
  • 物理层:定义了为建立、维护和拆除物理链路所需的机械的、电气的、功能的和规程的特性,其作用是使原始的数据比特流能在物理介质上传输。

IP、TCP/UDP协议

由于OSI/RM模型过于复杂也难以实现,现实中广泛使用的是TCP/IP 模型。TCP/IP是一个协议集,它也是分层模型,分为四层

屏幕快照 2017-01-09 下午4.33.48.png
  • 应用层:应用层是大多数普通与网络相关的程序为了通过网络与其他程序通信所使用的层。在应用层中,数据以应用内部使用的格式进行传送,然后被编码成标准协议格式。(如:HTTP协议、FTP文件传输协议、接收电子邮件的POP3和IMAP协议、发送邮件使用的SMTP协议、远程登录使用的SSH和Telnet等)
  • 传输层:传输层响应来自应用层的服务请求,并向网络层发出服务请求。传输层提供两台主机之间透明的数据传输,通常用于端到端的链接、流量控制或错误恢复。这一层两个最终要的协议是 TCP(传输控制协议)和UDP(用户数据包协议)。
  • 网络层:网络层提供端到端的数据交付,换句话说,它负责数据包从源发送到目的地,任务包括网络路由、差错控制和IP编址等。这一层的重要协议是IP(版本4和版本6)、ICMP(Internet控制报文协议)和IPSec(Internet协议安全)。
  • 网络接口层:是TCP/IP模型的最底层,负责通过网络发送和接收数据报;允许主机俩如网络是使用多种现成的与流行的技术,如以太网,令牌网等。

IP协议

互联网协议(Internet Protocol)是用于报文交换网络的一种面向数据的协议。IP实在TCP/IP协议中网络层的主要协议,任务根据源主机和目的主机的地址传送数据。为达到此目的,IP定义了寻址方法和数据报的封装结构。第一个架构的主要版本是IPv4,现在仍是最主要的互联网协议。

IP包格式:一个IP分为头部(header)和数据(payload/data)两部分。头部是为实现IP通信必须的附加信息,数据是IP通信要传送的信息。

屏幕快照 2017-01-10 上午11.06.37.png
  • 版本号(Version):长度4bit(位),标识目前采用的IP协议的版本号。IPv4值为 0100,IPv6值为0110。
  • IP包头部长度(IHL:Internet Header Length):长度4bit,作用是用来描述IP包头部长度,因为在IP包中有变化的可选部分。一个IP包头部最大长度为60个字节,最小长度为20个字节。IPv6的头部固定长度为40bytes,所以IPv6没有IHL区域。
  • 服务类型(Type of Service):长度8bit,8位按位被如下定义PPPDTRC0

PPP:定义包的优先级,取值越大数据越重要。
000 普通 (Routine)
001 优先的 (Priority)
010 立即的发送 (Immediate)
011 闪电式的 (Flash)
100 比闪电还闪电式的 (Flash Override)
101 CRI/TIC/ECP(找不到这个词的翻译)
110 网间控制 (Internetwork Control)
111 网络控制 (Network Control)
D 延时:0普通,1延时尽量小
T 吞吐量: 0:普通 1:流量尽量大
R 可靠性: 0:普通 1:可靠性尽量大
M 传输成本: 0:普通 1:成本尽量小
0 最后一位被保留,恒定为0

Type of Service最初是用来给IP包分优先级,比如语音通话需要实时性,所以它的IP包应该比Web服务的IP包有更高的优先级。然而,这个最初不错的想法没有被微软采纳。在Windows下生成的IP包都是相同的最高优先级,所以在当时造成Linux和Windows混合网络中,Linux的IP传输会慢于Windows (仅仅是因为Linux更加守规矩!)。后来,Type of Service被实际分为两部分:Differentiated Service Field (DS, 前6位)和Explicit Congestion Notification (ECN, 后2位),前者依然用来区分服务类型,而后者用于表明IP包途径路由的交通状况。IPv6的Traffic Class也被如此分成两部分。通过IP包提供不同服务的想法,并针对服务进行不同的优化的想法已经产生很久了,但具体做法并没有形成公认的协议。比如ECN区域,它用来表示IP包经过路径的交通状况。如果接收者收到的ECN区域显示路径上的很拥挤,那么接收者应该作出调整。但在实际上,许多接收者都会忽视ECN所包含的信息。交通状况的控制往往由更高层的比如TCP协议实现。

  • IP包总长度(Total length):长度16比特。 以字节为单位计算的IP包的长度 (包括头部和数据),所以IP包最大长度65535字节。
  • Identification, flags和fragment offset:这三个包都是为碎片化(fragmentation)服务的。碎片化是指一个路由器将接收到的IP包分拆成多个IP包传送,而接收这些“碎片”的路由器或者主机需要将“碎片”重新组合(reassembly)成一个IP包。不同的局域网所支持的最大传输单元(MTU, Maximum Transportation Unit)不同。如果一个IP包的大小超过了局域网支持的MTU,就需要在进入该局域网时碎片化传输(就好像方面面面饼太大了,必须掰碎才能放进碗里)。碎片化会给路由器和网络带来很大的负担。最好在IP包发出之前探测整个路径上的最小MTU,IP包的大小不超过该最小MTU,就可以避免碎片化。IPv6在设计上避免碎片化。每一个IPv6局域网的MTU都必须大于等于1280 bytes。IPv6的默认发送IP包大小为1280 bytes。
  • Time to Live 存活时间(Hop Limit in IPv6):Time to Live最初是表示一个IP包的最大存活时间:如果IP包在传输过程中超过Time to Live,那么IP包就作废。后来,IPv4的这个区域记录一个整数(比如30),表示在IP包接力过程中最多经过30个路由接力,如果超过30个路由接力,那么这个IP包就作废。IP包每经过一个路由器,路由器就给Time to Live减一。当一个路由器发现Time to Live为0时,就不再发送该IP包。IPv6中的Hop Limit区域记录的也是最大路由接力数,与IPv4的功能相同。Time to Live/Hop Limit避免了IP包在互联网中无限接力。
  • Protocol 协议(Next Header in IPv6):Protocol用来说明IP包Payload部分所遵循的协议,也就是IP包之上的协议是什么。它说明了IP包封装的是一个怎样的高层协议包(TCP? UDP?)。
  • 头部校验(header CheckSum):长度16位。用来做IP头部的正确性检测,但不包含数据部分。 因为每个路由器要改变TTL的值,所以路由器会为每个通过的数据包重新计算这个值。
  • 起源和目标地址(Source and Destination Addresses):这两个地段都是32比特。标识了这个IP包的起源和目标地址。要注意除非使用NAT,否则整个传输的过程中,这两个地址不会改变。

至此,IP包头基本的20字节已介绍完毕,此后部分属于可选项,不是必须的部分。

  • 可选项(Options):这是一个可变长的字段。该字段属于可选项,主要用于测试,由起源设备根据需要改写。可选项目包含以下内容:

  • 松散源路由(Loose source routing):给出一连串路由器接口的IP地址。IP包必须沿着这些IP地址传送,但是允许在相继的两个IP地址之间跳过多个路由器。

  • 严格源路由(Strict source routing):给出一连串路由器接口的IP地址。IP包必须沿着这些IP地址传送,如果下一跳不在IP地址表中则表示发生错误。

  • 路由记录(Record route):当IP包离开每个路由器的时候记录路由器的出站接口的IP地址。

  • 时间戳(Timestamps):当IP包离开每个路由器的时候记录时间。

  • 填充(Padding):因为IP包头长度(Header Length)部分的单位为32bit,所以IP包头的长度必须为32bit的整数倍。因此,在可选项后面,IP协议会填充若干个0,以达到32bit的整数倍。

TCP协议

传输控制协议TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

1、TCP通过以下方式提供可靠性:

  • 应用程序分割成TCP认为最合适发送的数据块。由TCP传递给IP的信息单位叫做报文段。
  • 当TCP发出一个报文段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,它就会重发这个报文段。
  • 当TCP收到发自TCP链接另一端的数据,它将发送一个确认。这个确认不是立即发送的,通常延时几分之一秒
  • TCP将保持它首部和数据的校验和。这个一个端到端的校验和,目的是检测数据在传输过程中的任何变化,如果收到报文段的校验和有错,TCP将丢弃这个报文段和不确认收到这个报文段。
  • 既然TCP报文段作为IP数据报来传输,而IP数据包的到达可能失序,因此TCP报文段的到达也可能失序。如果必要,TCP将对收到的数据进行排序,将收到的数据已正确的顺序交给应用层。
  • 既然IP数据报会发生重复,TCP链接端必须丢弃重复的数据。
  • TCP还能提供流量控制,TCP链接的每一方都有固定大小的缓空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。

2、TCP首部
TCP首部格式如下:

屏幕快照 2017-01-10 下午3.50.58.png
  • 每个TCP段都包含源端口和目的端口号,用于寻找发送端和接收端的应用程序。这两个值加上IP首部的源端口IP地址和目的端IP地址唯一确定一个TCP链接。
  • 序号用来标识从TCP发送端向接收端发送的数据字节流,它表示在这个报文段中第一个数据字节。如果将字节流看做在两个应用程序间的单项流动,则TCP用序号对每个字节进行计数。
  • 当建立一个链接时,SYN标志变1,序号字段包含由这个主机选择的该链接的初始序号ISN,该主机要发送数据的第一个字节序号为这个ISN加1,因为SYN标志使用了一个序号。
  • 既然每个被传输的字节都被计数,确认序号包含发送确认的一段所期望收到的下一个序号。因此,确认序号应当是上次已成功收到数据字节序号加1。只有ACK标志为1时确认序号字段才有效。
  • 发送ACK无需任何代价,因为32位的确认序号字段和ACK标志一样,总是TCP首部的一部分。因此一旦一个连接建立起来,这个字段总是被设置,ACK标志也总是被设置为1。
  • TCP为应用层提供全双工的服务。因此,连接的每一端必须保持每个方向上的传输数据序号。
  • TCP可以表述为一个没有选择确认或否认的窗口协议。因此TCP首部中的确认序号表示发送方已成功收到字节,但还不包含确认序号所指的字符。当前还无法对数据流中选定的部分进行确认。
  • 首部长度需要设置,因为任选字段的长度是可变的。TCP首部最多60个字节。
  • 6个标志位中的多个可同时设置为1 a:URG - 紧急指针有效
    b: ACK - 确认序号有效
    c: PSH - 接收方应尽快将这个报文段交给应用层
    d: RST - 重新连接
    e:SYN - 同步序号用来发送一个链接
    f: FIN - 发送端完成发送任务
  • TCP的流量控制由连接的每一端通过声明的窗口大小来提供。窗口大小为字节数,起始于确认序号字段指明的值,这个值是接收端期望接收的字节数。窗口大小是一个16位的字段,因而窗口大小最大为65535字节。
  • 检验和覆盖整个TCP报文端,TCP首部和TCP数据。这是一个强制性的字段,一定是由发送端计算和存储,并由接收端进行验证。TCP检验和的计算和UDP首部检验和的计算一样,也是用伪首部。
  • 紧急指针是一个正的偏移量,URG标志为1时才有效,表示数据需要优先处理,紧急指针指出在TCP段中的紧急数据的最后一个字节的序号,使接收方可以知道紧急数据共有多长。
  • 选项:最常用的选项字段是最大段大小(Maximum Segment Size, MSS),向对方通知本机可以接收的最大TCP段长度。MSS选项只在建立连接的请求中发送。

3、TCP连接的建立和终止
1)、建立连接协议(三次握手):

  • 客户端发送一个带SYN标志的TCP报文到服务器。这是三次握手过程中的报文1
  • 服务器发回包含服务器初始化序号的SYN报文段(报文段2)作为应答,同时将确认序号设置为客户端的ISN加1以对客户端的SYN报文段进行确认。一个SYN将占用一个序号。
  • 客户必须将确认序号设置为服务器的ISN加1以对服务器的SYN报文段进行确认(报文3).

2)、连接终止协议(四次挥手):
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个FIN只意味着这一个方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

  • TCP客户端发送一个FIN,用来关闭客户端到服务器的数据传送(报文4)。
  • 服务器收到这个FIN,它发回一个ACK,确认序号为收到序号加1(报文段5),和SYN一样,一个FIN将占用一个序号。
  • 服务器关闭客户端的链接,发送一个FIN给客户端(报文6)。
  • 客户端发回确认,并将确认序号设置为收到序号加1(报文段7)

3)、连接建立的超时:
如果与服务器无法建立连接,客户端就会三次向服务器发送连接请求。在规定的时间内服务器未应答,则连接失败。
4)、最大报文段长度MSS:
最大报文段长度表示TCP传往另一端的最大块数据的长度。当一个连接建立时,连接的双方都要通告各自的MSS。
一般,如果没有分段发生,MSS还是越大越好。报文段越大允许每个报文段传送的数据越多,相对IP和TCP首部有更高的网络利用率。当TCP发送一个SYN时,它能将MSS值设置为外出接口得MTU长度减去IP首部和TCP首部长度。对于以太网,MSS值可达到1460.
如果目的地址为非本地的,MSS值通常默认为536,是否本地主要通过网络号区分。MSS让主机限制另一端发送数据报的长度,加上主机也能控制它发送数据报的长度,这将使以较小MTU连接到一个网络上的主机避免分段。

TCP协议格式参考 http://blog.csdn.net/tanqiantot/article/details/7947525

UDP协议

用户数据包协议(UDP)是TCP/IP模型中一种面向无连接的传输层协议,提供了面向事物的简单不可靠信息传送服务。UDP基本上是IP协议与上层协议的接口。UDP协议适用于端口分别运行在同一台设备上的多个应用程序中。

UDP特点:
  • 是无连接的。相比TCP协议,UDP协议在传送数据前不需要建立连接,当然也就没有释放连接了。
  • 是尽最大努力交付的,也就是说UDP协议无法保证数据能够准确的交付到目的主机。也不需要对接收到的UDP报文进行确认。
  • 是面向报文的,也就是说UDP协议将应用层传输下来的数据封装在一个UDP包中,不进行拆分或合并,因此传输层再收到对方的UDP包后回去掉首部后,将数据原封不动的交给应用进程。
  • 没有拥塞控制,因此UDP协议的发送速率不受网络拥塞度的影响。
  • UDP支持一对一,一对多,多对一和多对多的交互通信。
  • UDP的头部占用较小,只占8个字节。
UDP报文格式:

UDP协议分为首部字段和数据字段,其中首部字段只占用8个字节,分别是个占用两个字节的源端口、目的端口、长度和检验和。

屏幕快照 2017-01-10 下午5.58.41.png
  • 长度:UDP报文的整个大小,最小为8个字节(仅为首部)。
  • 检验和:在进行检验和计算时,会添加一个伪首部一起进行运算。伪首部(占用12个字节)为:4个字节的源IP地址、4个字节的目的IP地址、1个字节的0、一个字节的数字17、以及占用2个字节UDP长度。这个伪首部不是报文的真正首部,只是引入为了计算校验和。相对于IP协议的只计算首部,UDP检验和会把首部和数据一起进行校验。接收端进行的校验和与UDP报文中的校验和相与,如果无差错应该全为1。如果有误,则将报文丢弃或者发给应用层、并附上差错警告。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,018评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,046评论 2 372
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,215评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,303评论 1 266
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,181评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,171评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,577评论 3 384
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,260评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,546评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,630评论 2 311
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,390评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,260评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,633评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,920评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,210评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,569评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,767评论 2 335

推荐阅读更多精彩内容