运输层协议--TCP及UDP协议
TCP及UDP协议
按照网络的五层分级结构来看,TCP及UDP位于运输层,故TCP及UDP是运输层协议。
TCP协议--传输控制协议
UDP协议--用户数据报协议
多路复用及多路分解
图多路复用及多路分解
接受主机中的运输层实际上并没有直接将数据交给进程,而是通过一个中间的套接字来传递。由于在任何一个时刻接受主机上可能有多个套接字,所以每个套接字都已一个唯一的标识符。
主机如何将一个收到的运输层报文段定向到合适的套接字?
为达到这一目的,在每个运输层报文段中设置了几个字段,在接收端,运输层检查并标识出接受套接字,然后将报文段定向到该套接字。
从而: 将运输层报文段中的数据交付到正确的套接字的工作叫做多路分解
从源主机的不同套接字中手机数据块,并为每个数据块封装首部信息从而生成报文段,然后将报文段传递到网络层的工作叫做多路复用
UDP协议
由RFC 768定义的UDP除了多路复用/多路分解功能及一些轻型的差错检测外,几部没对IP增加别的东西。
UDP被称为无连接的,不可靠数据传输
UDP报文段结构
首部只有四个字段,每个字段两个字节
源端口号、目的端口号:通过端口号可以使目的主机将应用数据交给运行在目的端系统中的相应进程
检验和:接收主机使用检验和来检查报文段中是否存在差错
长度:指明包括首部在内的UDP报文段的长度(以字节为单位)
UDP检验和
发送方的UDP对报文段的所有16比特字的和进行反码运算,求和时遇到任何语出都被回卷。得到的结果放在UDP报文段中的检验和字段。
例:假设报文段中有3个16比特字:
0110011001100000
0101010101010101
1000111100001100
前两个16比特字之和:
0110011001100000
0101010101010101
---------------------------
1011101110110101
再将上面的和与第三个字相加,得到:
1011101110110101
1000111100001100
---------------------------
0100101011000010
最后一次加法有溢出,这要被回卷(将溢出的1放到最后位继续加)。
反码:0变1,1变0
1011010100111101
此时就是检验和
在接收方,全部的4个16比特字包括检验和,一起相加。如果分组中无差错,接收方这个和将是
1111111111111111
如果其中有0那么我们就知道分组中出了差错
TCP协议
TCP协议是一个可靠数据传输协议,面向连接
进程间利用网络通信的过程中,如果数据传输的通道是一个可靠信道,即在数据在传输过程中不会产生丢失及损耗,那么进程间通信是完全可靠的。但是在实际的应用中,数据传输的通道是不可靠的,所以会产生数据的丢失等问题,为了解决这个问题,就产生了可靠数据传输协议,通过协议的方式来实现数据的可靠传输。
TCP连接在两个进程“握手”猴将连接状态完全保留在两个端系统中,TCP协议只在端系统中运行,而不再中间网络元素中运行,所以中间要素并不会维持TCP的连接状态。
TCP报文结构
源端口号和目的端口号同UDP
序号字段:32比特的
确认号字段:32比特 序号字段和确认号字段用于实现可靠的数据传输
接收窗口:16比特 用于流量控制
首部长度字段 32比特字为单位的TCP首部长度
可选与变长的选项字段 发送方与接收方协商最大报文段长度
标志字段 ACK比特--用于指示确认字段中的值有效的
RST、SYN和FIN比特用于连接建立和拆除
PSH比特被设置时,指示接收方应立即将数据交给上层
URG比特用来指示报文段里存着被发送方的上层实体置为“紧急”的数据
序号和确认号
TCP把数据看成一个无结构的但是有序的字节流。序号建立在传送的字节流上,而不是建立在传送的报文段的序列之上。一个报文段的序号因此是该报文段首字节的字节流编号。
例:主机A上的一个进程想通过一条TCP连接向主机B上的一个进程发送一个数据流。A中的TCP将隐式的对数据流中的每一个字节进行编号。假定数据流由一个包含500000字节的文件组成,MSS为1000字节,数据流的首字节编号是0。TCP将该数据流构建500个报文段。第一个报文段的序号被赋为0,第二个报文段的序号被赋为1000,第三个报文段的序号被赋为2000,以此类推。每一个序号被填入到相应TCP报文段首部的序号字段中。
确认号字段。
TCP是全双工的,因此主机A也许在向主机B发送数据的同时,也接收来自主机B的数据。
从主机B到达的每个报文段中都有一个序号用于从B流向A的数据。主机A填充进报文段的确认号是主机A期望从主机B收到的下一个字节的序号。
客户机TCP与服务器TCP通信的过程:
建立连接的三次握手:
第一步:客户机端的TCP首先向服务器端的TCP发送一个特殊的TCP报文段。该报文段中不包含应用层数据,但是报文段的首部中的一个标志位(SYN比特)被置为1。另外,客户机会选择一个起始序号(client_isn),并将其放置到该起始的TCP SYN报文段的序号字段中。该报文段会被封装在一个IP数据报中,并发送给服务器。
第二步:一旦包含TCP SYN报文段的IP数据到达服务器主机(假定到达),服务器会从该数据报中提取出TCP SYN报文段,为该TCP连接分配TCP缓存和变量,并向客户机TCP发送允许连接的报文段。这个允许连接的报文段也不包含应用层数据。但是报文段的首部却包含了3个重要的信息。首先,SYN比特被置为1.其次该TCP报文段首部的确认号字段被置为client_isn+1.最后服务器选择自己的初始序号(server——isn),并将其放置到TCP报文段首部的序号字段中。
第三步:在收到SYN ACK报文段后,客户机也要给该连接分配缓存和变量。客户机主机还会向服务器发送另一个报文段,这个报文段对服务器的允许连接的报文段进行了确认(客户机通过将值server_isn+1放置到TCP报文段首部的确认字段中来完成此项工作)因为连接已经建立,所以该SYN比特被置为0。
数据传输:
数据传输的过程中SYN都会被置为0
断开连接的四次挥手:
参与TCP连接的两方都可以终止连接。
假设客户机打算关闭连接,客户机应用进程发出一个关闭连接命令。这会引起客户机TCP向服务器进程发送一个特殊的TCP报文段。这个特殊的报文段首部中的一个标志比特,即FIN比特被设置为1。当服务器收到该报文段后,就向客户机会送一个确认报文段。然后服务器发送其终止报文段,其FIN比特被置为1.最后,该客户机对这个服务器的终止报文进行确认。此时,两台主机商用与该连接的所有资源都被释放。
运输层协议--TCP及UDP协议的更多相关文章
- 网络编程协议(TCP和UDP协议,黏包问题)以及socketserver模块
网络编程协议 1.osi七层模型 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 2.套接字 socket 有两类,一种基于文件类型,一种基于网络类型 3.Tcp和udp协议 ...
- 网络编程协议(TCP和UDP协议,粘包问题)以及socketserver模块
网络编程协议 1.osi七层模型 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 2.套接字 socket 有两类,一种基于文件类型,一种基于网络类型 3.Tcp和udp协议 ...
- 运输层协议TCP和UDP
运输层协议TCP和UDP 一.用户数据报协议 UDP 1.1.UDP 概述 UDP 只在 IP 的数据报服务之上增加了很少一点的功能,即端口的功能和差错检测的功能. 虽然 UDP 用户数据报只能提供不 ...
- 面试:TCP和UDP协议
目录 TCP 协议 UDP协议 TCP和UDP的区别 TCP和UDP的使用场景 一 TCP协议 1.TCP的头部格式 理解TCP协议,首要的就是TCP协议的头部格式 · Source P ...
- TCP和UDP 协议发送数据包的大小
在进行UDP编程的时候,我们最容易想到的问题就是,一次发送多少bytes好? 当然,这个没有唯一答案,相对于不同的系统,不同的要求,其得到的答案是不一样的,这里仅对像ICQ一类的发送聊天消息的情况作分 ...
- 软件开发架构,网络编程简介,OSI七层协议,TCP和UDP协议
软件开发架构 什么是软件开发架构 1.软件架构是一个系统的草图. 2.软件架构描述的对象是直接构成系统的抽象组件. 3.各个组件之间的连接则明确和相对细致地描述组件之间的通讯. 4.在实现阶段,这些抽 ...
- 传输层协议TCP和UDP
本文力图简洁,让读者对TCP和UDP有个初步的认知.闲话少说,现在开始吧.TCP和UDP都是传输层的协议.TCP通过三次握手建立可靠连接,对未送达的消息重新进行发送.UDP不建立连接而直接发送,对未送 ...
- TCP与UDP协议
传输控制协议(Transmission Control Protocol, TCP)和用户数据报协议(User Datagram Protocol, UDP)是典型的传输层协议. 传输层协议基于网络层 ...
- TCP和UDP协议的区别
TCP和UDP都是传输层的协议 UDP协议的特点: UDP协议是一种无连接的.不可靠的传输层协议(尽力而为的协议) 为什么说UDP是一种无连接.不可靠的协议呢?UDP协议在传输报文之前不需要在双方之间 ...
随机推荐
- Thinkphp整合各个功能
thinkphp整合Auth权限管理.支付宝.微信支付.阿里oss.友盟推送.融云即时通讯.云通讯短信.Email.Excel.PDF等等: 基于thinkphp扩展了大量的功能:而不改动thinkp ...
- angularJs 多文件动态上传(删除其中一个文件的时候,要么file没被删除,要么删除了之后,点击事件失效)
<div cacModule.controller('CacScriptEditCtrl', CacScriptEditCtrl); CacScriptEditCtrl.$inject = [' ...
- 让所有IE支持HTML5的解决方案
自从HTML5能为我们的新网页带来更高效洁净的代码而得到更多的关注,然而唯一能让IE识别那些新元素(如<article>)的途径是使用HTML5 shiv,感谢remy sharp为我们提 ...
- Spring_day03--Spring的事务管理
Spring的事务管理 事务概念 1 什么事务 事务是操作中最基本的单元,表示一组操作要么都成功,有一个失败那么所有都失败. 2 事务特性 原子性 一致性 隔离性 持久性 3 不考虑隔离性产生读问题 ...
- ios笔试题(选择题)
1-10 C语言 & 计算机基础 1.请看下面一段代码 static int a = 1; int main(){ int b = 2; char *c = NULL; c = (char * ...
- 170411、java Socket通信的简单例子(UDP)
服务端代码: package com.bobohe.socket; import java.io.*; import java.net.*; class UDPServer { public stat ...
- Windows配置MinGW环境变量
先安装MinGW 1.添加3个系统变量(根据自己的实际路径) MinGW_INCLUDE_PATH MinGW_LIBRARY_PATH MinGW_PATH 2.将MinGW_PATH添加到Path ...
- jquery筛选数组方法——$.grep(),$.map()
function greptest() { var arr = "1,2,3,'',one,two,three".split(','); var newarr = $.grep(a ...
- 剑指Offer——不用加减乘除做加法
题目描述: 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 分析: "^"是不带进位的加法. "&"可以得到所有进位位组 ...
- 安装串口设备驱动时遇到 Windows 无法验证此设备所需的驱动程序的数字签名。最近的硬件或软件更改安装的文件可能未正确签名或已损坏,或者可能是来自未知来源的恶意软件. 问题该如何处理?
win7 系统直接在 cmd 命令行中输入以下语句,重启电脑后重新安装驱动即可. BCDEDIT -SET LOADOPTIONS DISABLE_INTEGRITY_CHECKS BCDEDIT - ...