文档章节

网络协议

黑眼圈君
 黑眼圈君
发布于 2017/02/14 10:56
字数 936
阅读 33
收藏 2
点赞 0
评论 0

基础加固:

    tcp/ip 协议(四层):

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

        IP:网络层协议。跨越多种数据链路传输数据包,提供路由和寻址功能。

ok,划出关键点:面向连接,可靠,基于字节流,传输层协议。

有几个疑问:

1.啥叫面向连接?

        面向连接举例:两个人之间通过电话进行通信。

        面向无连接举例:邮政服务,用户把信函放在邮件中期待邮政处理流程来传递邮政包裹。显然,不可达代表不可靠。

从程序实现的角度解析面向连接、面向无连接如下:

         TCP面向连接,UDP面向无连接(在默认的阻塞模式下):

         在TCP协议中,当客户端退出程序或断开连接时,TCP协议的recv函数会立即返回不再阻塞,因为服务端自己知道客户端已经退出或断开连接,证明它是面向连接的;

        而在UDP协议中,recvfrom这个接收函数将会始终保持阻塞,因为服务端自己不知道客户端已经退出或断开连接,证明它是面向无连接的)。

    说白了,面向 就是指 “知道,了解,针对于,基于”的含义。

2.怎么保证可靠?

       

交互:

    建立连接:三次握手。

    描述:

第一次握手

client(客户端)发送一个SYN(seq=x)包给server(服务器),然后“期待”server的ACK回复p.s: seq为sequence(序列)的缩写,ACK为acknowledge(通知)的缩写。

第二次握手

  1. server(服务器)接收到SYN(seq=x)包后就返回一个ACK(ack=x+1)包,意思是告诉client(客户端):我已经成功接收到你的SYN包。

  2. 并且自己也发送一个SYN(seq=y)包,然后”期待“client(客户端)的ACK回复

第三次握手

  1. client(客户端)接收到server(服务器)发回的ACK(ack=x+1)包后,然后就把自己的状态设置为ESTABLISHED(已建立连接)。

  2. 然后根据server(服务端)发回的SYN(seq=y)包,返回给”期待”中的server一个ACK(ack=x+1)包。期待中的server收到ACK回复,也把自己的状态设置为ESTABLISHED(已建立连接)。到此TCP三次握手完成,client与server可以正常进行通信了。

为什么需要三次握手?

这个问题的本质是, 前提就是信道不可靠, 但是通信双发需要就某个问题达成一致。而要解决这个问题,  无论你在消息中包含什么信息, 三次通信是理论上的最小值。 所以三次握手不是TCP本身的要求, 而是为了满足"在不可靠信道上可靠地传输信息"这一需求所导致的. 请注意这里的本质需求,信道不可靠, 数据传输要可靠。三次达到了, 那后面你想接着握手也好, 发数据也好, 跟进行可靠信息传输的需求就没关系了。 因此,如果信道是可靠的, 即无论什么时候发出消息, 对方一定能收到, 或者你不关心是否要保证对方收到你的消息, 那就能像UDP那样直接发送消息就可以了.”。

很简单:

就像两个人说话,A 对 B 发消息(第一次握手),B 读懂消息并且回复应答(第二次握手),A读懂消息并且回复应答(第三次握手)。确保两者可以互相交流,三次是最小值。

 

关闭连接:四次挥手

 

 

 

© 著作权归作者所有

共有 人打赏支持
黑眼圈君
粉丝 1
博文 19
码字总数 14272
作品 0
松江
程序员

暂无相关文章

JavaScript零基础入门——(十一)JavaScript的DOM操作

JavaScript零基础入门——(十一)JavaScript的DOM操作 大家好,欢迎回到我们的JavaScript零基础入门。最近有些同学问我说,我讲的的比书上的精简不少。其实呢,我主要讲的是我在开发中经常会...

JandenMa ⋅ 20分钟前 ⋅ 0

volatile和synchronized的区别

volatile和synchronized的区别 在讲这个之前需要先了解下JMM(Java memory Model :java内存模型):并发过程中如何处理可见性、原子性、有序性的问题--建立JMM模型 详情请看:https://baike.b...

MarinJ_Shao ⋅ 47分钟前 ⋅ 0

深入分析Kubernetes Critical Pod(一)

Author: xidianwangtao@gmail.com 摘要:大家在部署Kubernetes集群AddOn组件的时候,经常会看到Annotation scheduler.alpha.kubernetes.io/critical-pod"="",以表示这是一个关键服务,那你知...

WaltonWang ⋅ 54分钟前 ⋅ 0

原子性 - synchronized关键词

原子性概念 原子性提供了程序的互斥操作,同一时刻只能有一个线程能对某块代码进行操作。 原子性的实现方式 在jdk中,原子性的实现方式主要分为: synchronized:关键词,它依赖于JVM,保证了同...

dotleo ⋅ 今天 ⋅ 0

【2018.06.22学习笔记】【linux高级知识 14.4-15.3】

14.4 exportfs命令 14.5 NFS客户端问题 15.1 FTP介绍 15.2/15.3 使用vsftpd搭建ftp

lgsxp ⋅ 今天 ⋅ 0

JeeSite 4.0 功能权限管理基础(Shiro)

Shiro是Apache的一个开源框架,是一个权限管理的框架,实现用户认证、用户授权等。 只要有用户参与一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户...

ThinkGem ⋅ 昨天 ⋅ 0

python f-string 字符串格式化

主要内容 从Python 3.6开始,f-string是格式化字符串的一种很好的新方法。与其他格式化方式相比,它们不仅更易读,更简洁,不易出错,而且速度更快! 在本文的最后,您将了解如何以及为什么今...

阿豪boy ⋅ 昨天 ⋅ 0

Python实现自动登录站点

如果我们想要实现自动登录,那么我们就需要能够驱动浏览器(比如谷歌浏览器)来实现操作,ChromeDriver 刚好能够帮助我们这一点(非谷歌浏览器的驱动有所不同)。 一、确认软件版本 首先我们...

blackfoxya ⋅ 昨天 ⋅ 0

线性回归原理和实现基本认识

一:介绍 定义:线性回归在假设特证满足线性关系,根据给定的训练数据训练一个模型,并用此模型进行预测。为了了解这个定义,我们先举个简单的例子;我们假设一个线性方程 Y=2x+1, x变量为商...

wangxuwei ⋅ 昨天 ⋅ 0

容器之查看minikue的environment——minikube的环境信息

执行如下命令 mjduan@mjduandeMacBook-Pro:~/Docker % minikube docker-envexport DOCKER_TLS_VERIFY="1"export DOCKER_HOST="tcp://192.168.99.100:2376"export DOCKER_CERT_PATH="/U......

汉斯-冯-拉特 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部