zoukankan      html  css  js  c++  java
  • http tcp

     OSI:(Open System Interconnect),即开放式系统互联。

    TCP:三次握手可靠吗  

    三次是保证双方互相明确对方能收能发的最低值。

    理论上讲不论握手多少次都不能确认一条信道是“可靠”的,但通过3次握手可以至少确认它是“可用”的,再往上加握手次数不过是提高“它是可用的”这个结论的可信程度。

    世界上不存在完全可靠的通信协议

    从通信 时间成本 空间成本 以及 可靠度 来讲,选择了“三次握手”作为点对点通信的一般规则。

    简单解释:

    主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?”,这是第一次对话;

    主机B向主机A发送同意连接和要求同步(同步就是两台主机一个在发送,一个在接收,协调工作)的数据包:“可以,你什么时候发?”,这是第二次对话;

    主机A再发出一个数据包确认主机B的要求同步:“我现在就发,你接着吧!”,这是第三次对话。

    三次“对话”的目的是使数据包的发送和接收同步,经过三次“对话”之后,主机A才向主机B正式发送数据。

    建立一个连接需要三次握手,而终止一个连接要经过四次握手,这是由TCP的半关闭(half-close)造成

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

    是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议。 

     

     TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)

    是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCPIP两个协议,而是指一个由FTPSMTP、TCP、UDP、IP等协议构成的协议簇,

    只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。

    UCP和UDP区别:

    http协议和其他协议的关系

    HTTP是应用层协议。TCP是传输层协议。HTTP是建立在TCP协议之上。

    我们在传输数据时,可以只使用TCP/IP协议,但是那样的话,如果没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用到应用层协议,

    应用层协议有很多,比如HTTP、FTP、TELNET等,也可以自己定义应用层协议。

    WEB使用HTTP协议作应用层协议,以封装HTTP文本信息,然后使用TCP/IP做传输层协议将它发到网络上。

    Socket(套接字):

    传输层实现端到端的通信,因此,每一个传输层连接有两个端点。那么,传输层连接的端点是什么呢?不是主机,不是主机的IP地址,不是应用进程,也不是传输层的协议端口。传输层连接的端点叫做套接字(socket)。根据RFC793的定义:端口号拼接到IP地址就构成了套接字。所谓套接字,实际上是一个通信端点,每个套接字都有一个套接字序号,包括主机的IP地址与一个16位的主机端口号,即形如(主机IP地址:端口号)。例如,如果IP地址是210.37.145.1,而端口号是23,那么得到套接字就是(210.37.145.1:23)。
    总之,套接字Socket=(IP地址:端口号),套接字的表示方法是点分十进制的IP地址后面写上端口号,中间用冒号或逗号隔开。每一个传输层连接唯一地被通信两端的两个端点(即两个套接字)所确定。
    套接字可以看成是两个网络应用程序进行通信时,各自通信连接中的一个端点。通信时,其中的一个网络应用程序将要传输的一段信息写入它所在主机的Socket中,该Socket通过网络接口卡的传输介质将这段信息发送给另一台主机的Socket中,使这段信息能传送到其他程序中。因此,两个应用程序之间的数据传输要通过套接字来完成。
    在网络应用程序设计时,由于TCP/IP的核心内容被封装在操作系统中,如果应用程序要使用TCP/IP,可以通过系统提供的TCP/IP的编程接口来实现。在Windows环境下,网络应用程序编程接口称作Windows Socket。为了支持用户开发面向应用的通信程序,大部分系统都提供了一组基于TCP或者UDP的应用程序编程接口(API),该接口通常以一组函数的形式出现,也称为套接字(Socket)。 [1] 
     
    现在,我们知道了网络中进程间如何通信,即利用三元组【ip地址,协议,端口】可以进行网络间通信了,那我们应该怎么实现了,因此,我们socket应运而生,它就是利用三元组解决网络通信的一个中间件工具,就目前而言,几乎所有的应用程序都是采用socket,如UNIX BSD的套接字(socket)和UNIX System V的TLI(已经被淘汰)。
    Socket通信的数据传输方式,常用的有两种:
      a、SOCK_STREAM:表示面向连接的数据传输方式。数据可以准确无误地到达另一台计算机,如果损坏或丢失,可以重新发送,但效率相对较慢。常见的 http 协议就使用 SOCK_STREAM 传输数据,因为要确保数据的正确性,否则网页不能正常解析。
      b、SOCK_DGRAM:表示无连接的数据传输方式。计算机只管传输数据,不作数据校验,如果数据在传输中损坏,或者没有到达另一台计算机,是没有办法补救的。也就是说,数据错了就错了,无法重传。因为 SOCK_DGRAM 所做的校验工作少,所以效率比 SOCK_STREAM 高。
      例如:QQ 视频聊天和语音聊天就使用 SOCK_DGRAM 传输数据,因为首先要保证通信的效率,尽量减小延迟,而数据的正确性是次要的,即使丢失很小的一部分数据,视频和音频也可以正常解析,最多出现噪点或杂音,不会对通信质量有实质的影响
     

    套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。

    应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提 供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口。应 用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务

  • 相关阅读:
    关于 控制反转与依赖注入 对初学者的一点帮助
    转载--文章(感谢米粒儿博主分享) 关于 Json.net序列化时间问题
    转载--文章(感谢陈晨博主分享) 关于 Json.net
    B-JUI框架使用探究
    什么是Entity Framework(ORM)
    字典
    Docker部署Linux+Nginx+Mariadb+PHP环境
    Docker部署Django+nginx+uwsgi环境
    Docker部署Django+apache+mod_wsgi环境
    Docker容器技术
  • 原文地址:https://www.cnblogs.com/light-train-union/p/12623834.html
Copyright © 2011-2022 走看看