TCP

TCP/IP是一种网络通讯协议,而socket则是TCP/IP网络最为通用的API,即一种应用程序接口,称为套接字。TCP是面向连接的协议,在进行数据收发前必须连接,且在收发时必须保持该连接。在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG。其中SYN(synchronous)表示要求建立连接,ACK(acknowledgement)表示应答,FIN(finish)表示要求关闭连接,PSH(push)表示有数据传输,RST(reset)表示连接重置,URG(urgent)表示紧急。

1. TCP的三次握手连接:

第一次握手:客户端发送SYN包(SYN = 1)到服务器,随机生成Sequence number = X,并进入SYN_SEND状态,等待服务器确认;

第二次握手:服务器收到SYN包,必须确认客户的SYN(SYN = 1),同时自己也发送一个ACK包(ACK = X+1),即SYN+ACK包,同时随机生成一个Sequence number = Y,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN + ACK包,向服务器发送确认包ACK(ACK = Y+1),同时随机生成一个Sequence number = Z,此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

其中握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。

2. TCP的四次挥手断开连接

第一次挥手:主动方发送FIN + ACK包到被动方,随机生成Sequence number = X,并进入FIN_WAIT_1状态,等待被动方确认;

第二次挥手:被动方接收到主动方的FIN + ACK包后,并返回ACK(ACK = X + 1)包,并随机生成Sequence number = Z发送给主动方,并进入CLOSE_WAIT状态,此时主动方接收到信息后随即进入FIN_WAIT_2状态;

第三次挥手:被动方发送FIN+ACK(ack = X + 1)包给主动方,并随机生成Sequence number = Y,并进入LAST_ACK状态;

第四次挥手:主动方接收到被动方的FIN+ACK包以后,向被动方发送ACK(ack = Y+1)包,随即自身进入TIME_WAIT状态,被动方接收到ACK包后进入CLOSED状态,紧接着主动方等待2MSL后也进入CLOSED状态,至此连接断开。

UDP

UDP(User Datagram Protocol)用户数据报协议,它在OSI模型的传输层,OSI模型的传输层有UDP协议,TCP协议和刚开发出来的一种新的协议SCTP。如果网络中两个主机上的应用程序要相互通信,其一要知道彼此主机的IP,其二要知道主机中运行程序可监听的端口。因为同一主机上的程序使用网络是通过端口号来区分的。因此为了使用UDP,我们需要一对套接字地址:客户端套接字地址和服务器套接字地址。

UDP提供无连接服务。客户端向服务端发送数据时不必先建立连接。客户端创建一个套接字并向服务器发送一个数据报,然后客户端可以立即用这个套接字向另外一个服务器发送其它数据。不能确保UDP数据报最终到达目的地。UDP对接收的数据报不发生确认,发送端不知道数据是否被正确接收,也不会重发数据。UDP传输数据较TCP快,占用系统资源少。

TCP和UDP的区别

1. TCP是面向链接的,虽然说网络的不安全不稳定特性决定了多少次握手都不能保证连接的可靠性,但TCP的三次握手在最低限度上(实际上也很大程度上保证了)保证了连接的可靠性。而UDP不是面向连接的,UDP传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,发送端不知道数据是否会正确接收,当然也不用重发,所以说UDP是无连接的、不可靠的一种数据传输协议。

2. 也正由于1所说的特点,使得UDP的开销更小数据传输速率更高,因为不必进行收发数据的确认,所以UDP的实时性更好。知道了TCP和UDP的区别,就不难理解为何采用TCP传输协议的MSN比采用UDP的QQ传输文件慢了,但并不能说QQ的通信是不安全的,因为程序员可以手动对UDP的数据收发进行验证,比如发送方对每个数据包进行编号然后由接收方进行验证啊什么的,即使是这样,UDP因为在底层协议的封装上没有采用类似TCP的“三次握手”而实现了TCP所无法达到的传输效率。

3. 人们通常用电话连线来说明TCP协议,而UDP协议,则常常用邮递来做比喻。

TCP

UDP

是否连接

面向连接

面向非连接

传输可靠性

可靠

不可靠

应用场合

传输大量数据

少量数据

速度

TCP&UDP基础的更多相关文章

  1. 异常处理与网络基础中的tcp,udp协议

    # 异常处理: # 什么是异常?异常和错误的区别 # Error 语法错误 比较明显的错误 在编译代码阶段就能检测出来 # Iteration 异常 在执行代码的过程中引发的异常 # 异常发生之后的效 ...

  2. 网络编程—网络基础概览、socket,TCP/UDP协议

    网络基础概览 socket概览 socket模块—TCP/UDP的实现 TCP/UDP总结 网络基础概览 osi七层协议各层主要的协议 # 物理层传输电信号1010101010 # 数据链路层,以太网 ...

  3. 网络基础--简单理解什么是DNS? TCP? UDP? Http? Socket?

    什么是IP 协议?  协议就是为了实现网络通信而创建的一系列规范.  通常我们的网络模型从上到下共分为4层: 应用层, 传输层, 网络层 和数据链路层. IP协议属于网络层协议,它精确定义了网络通信中 ...

  4. HP-SOCKET TCP/UDP通信框架库解析

    项目概述: HP-SOCKET是一套通用TCP/UDP通信框架,包括服务器.客户端.Agent组件:其目标是提供高性能.通用性.简易性.可扩展.可定制: 鉴于此,其仅实现基本的通用框架通信.数据收发功 ...

  5. 初入网络系列笔记(1)TCP/IP基础

    一.借鉴说明,本博文借鉴以下博文 1.BlueTzar,TCP/IP四层模型, http://www.cnblogs.com/BlueTzar/articles/811160.html 2.叶剑峰,漫 ...

  6. TCP/IP基础概念及通信过程举例

    TCP/IP基础概念及通信过程举例 出现 上个世纪60年代,由于中央集中式网络的容灾性较弱,以美国国防部为中心的一家组织研究出分组交换网络.后来为了验证分组交换技术的实用性,ARPANET出现了,并且 ...

  7. tcp/udp高并发和高吐吞性能测试工具

    在编写一个网络服务的时候都比较关心这个服务能达到多少并发连接,而在这连接的基础上又能达到一个怎样的交互能力.编写服务已经是一件很花力气的事情,而还要去编写一个能够体现结果的测试工具就更加消耗工作时间. ...

  8. TCP/IP基础知识

    TCP/IP基础知识 网络 TCP/IP 引言 本篇属于TCP/IP协议的基础知识,重点介绍了TCP/IP协议簇的内容.作用以及TCP.UDP.IP三种常见网络协议相关的基础知识. 内容 TCP/IP ...

  9. Java 网络编程(二) 两类传输协议:TCP UDP

    链接地址:http://www.cnblogs.com/mengdd/archive/2013/03/09/2951841.html 两类传输协议:TCP,UDP TCP TCP是Transfer C ...

随机推荐

  1. Codeforces 937 D. Sleepy Game(DFS 判断环)

    题目链接: Sleepy Game 题意: Petya and Vasya 在玩移动旗子的游戏, 谁不能移动就输了. Vasya在订移动计划的时候睡着了, 然后Petya 就想趁着Vasya睡着的时候 ...

  2. ubuntu下编译源码 make 出现 make: 'Makefile' is up to date.

    其实只需要 make就行了,不需要 make Makefile 当然,make的前提是,执行 ./configure 不报错

  3. Merge语句中NULL的陷阱

    NULL表示unknown,不确定值,所以任何值(包括null值)和NULL值比较都是不可知的,在on子句,where子句,Merge或case的when子句中,任何值和null比较的结果都是fals ...

  4. MySQL数据库查询某个库下有几张数据表

    如果统计某数据库中存在多少张数据表,使用如下SQL检索语句即可: SELECT COUNT(*) TABLES, table_schema FROM information_schema.TABLES ...

  5. linux用命令行编译使用函数库

    同步于气象家园日志 from fcode 视频 编译静态链接库   gfortran -c sub.f90 func.f90  产生了func.mod文件.注:mod文件是静态库的接口.如果删掉了fu ...

  6. jenkins+Gitlab持续集成环境配置教程

    环境简介: Jenkins 2.156(本地win10) GitLab Enterprise Edition 10.1.4-ee (远程服务器) Apache Ant 1.9.13 (本地win10) ...

  7. 在初学Flask中遇到的小问题。

    今天初步认识到了Flask这个轻量级web开发框架.对于初步认识框架的我,暂时的有了一个小小的认识, 因为初学.也没有什么代码可供参开.一下的就是一个小小的例子. # 导包from flask imp ...

  8. react-native初体验(2) — 认识路由

    如果学习止步于 hello world, 那么人生也太没意思了.这次要做一个看起来真实的应用.多添加几个页面,让他们可以交互,动起来. react-native 官方推荐使用 react-naviga ...

  9. 5. 使用Flask蓝图(blueprint)

    一直到现在都没有怎么写代码,可能更得比较慢. 作业回顾 先来看一下文章4的作业吧,使用logbook的时候,遇到了时区不对的情况.那么我们怎么去解决这个问题呢? 实际上logbook默认采用的是世界标 ...

  10. Ubuntu下配置Anaconda

    转自:https://blog.csdn.net/Horcham/article/details/57075388 安装Anaconda Ubuntu下似乎库中不自带Anaconda,是自带纯净的py ...