壹:tcp协议:可靠传输

一: 3次握手,建立链接;4次挥手,断开链接

3次握手,建立链接:图解 ,这样双向通路就建立完成了。

在建立链接时,并没有数据传输,所以中间两部可以合在一起,也就是3次握手,建立了链接(图1)

此时,有一个问题,客户端给服务端发完包以后,服务端又回一个包,那么客户端如何知道,

服务端回的这个包是基于上一次的请求信息而来的。所以需要一个记号,也就是seq=x,从而解决

上述的问题(图2)。

4次挥手,断开链接:图解 , 建成链接之后,就该基于双向通路进行数据的传递了。

而且说明一点:tcp协议传输数据更加可靠,这是因为tcp协议 “有求必应”,也就是客户端给服务端发一个包,

服务端一定要回一个包,要有一个回应。所以数据更不容易丢失,才更加可靠。

断开链接,由于要考虑到数据的发送是否已经完成,所以需要4步,才断开链接,例(图3),客户端数据发送完成,

请求断开链接(fin=1),但是此时服务端数据可能并没有完成,所以不能合成3步。

                       

二: tcp协议的相关状态:状态可以在cmd中去查看,命令:netstat  -an  |findstr  ?(例:TCP)

(LISTENING,ESTABLISHED,……)

客户端上可以查看到什么样的状态信息:客户端一旦发送完一个请求信息syn=1以后,客户端立马会进入一个状态,

叫syn_send的状态。服务端在收到这个请求信息之前,服务端会首先处于一个状态,叫listen状态,一旦服务端

收到一个syn=1请求信息后,服务端就会从listen状态立马进入一个叫syn_rcvd的状态(received),代表收到请

求信息了。服务端收到请求信息后,服务端开始给客户端回数据,客户端一旦收到这个确认信息后,客户端会立

马进入到一个叫ESTABLISHED的状态(链接已经建立成功),那这个数据包回到服务端,服务端一旦收到ack=1

的确认信息后,服务端也会进入到一个叫ESTABLISHED的状态。

所以(图4) tcp三次握手在客户端会看到哪些状态,syn_send和ESTABLISHED,

在服务端会看到哪些状态,listen,syn_rcvd和ESTABLISHED

如果想要用上面的命令netstat..去捕捉这些状态的话,

在客户端中,通常只能捕捉到ESTABLISHED状态,因为tcp三次握手速度非常快,客户端在发送完请求信息后,

瞬间就进入到了ESTABLISHED状态,所以几乎不可能捕捉到syn_send状态。

在服务端中,通常只能捕捉到listen和ESTABLISHED状态,也是因为速度太快....

(图5)tcp断开链接的几种状态:

三:syn洪水攻击:就是黑客模拟大量的假的客户端来向服务端发送正常的syn请求,发送给服务端以后,服务端就要响应回去,

然后等待着客户端的回应,然而这是黑客模拟的假的客户端,并不会回应了,所以服务端的资源一直被占用着,这时

syn_rcvd的状态就会大量涌现。

四:半连接池(backlog):服务端有一个半连接池,专门用来存请求信息,就是一个队列,先进先出,客户端来一个请求,

就把请求放到半连接池中,注意,放的是请求数,不是链接数。当然如果遭受syn洪水攻击,就应该调高半

连接池的大小,但这并不能从根本上解决问题,因为半连接池占用的是内存空间,所以最大也不会大过内存

空间,所以如果流量足够大的情况下,半连接池的作用就没有用了。

贰:socket(套接字)介绍:socket是应用层与传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供

应用层调用已实现进程在网络中通信。

基于tcp协议通信的套接字(简单版本)   例:

tcp协议以及socket介绍的更多相关文章

  1. 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

    Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...

  2. 基于TCP 协议的socket 简单通信

    DNS 服务器:域名解析 socket 套接字 : ​ socket 是处于应用层与传输层之间的抽象层,也是一组操作起来非常简单的接口(接受数据),此接口接受数据之后,交由操作系统 为什么存在 soc ...

  3. 自学Python-基于tcp协议的socket

    自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...

  4. Python基础系列讲解——TCP协议的socket编程

    前言 我们知道TCP协议(Transmission Control Protocol, 传输控制协议)是一种面向连接的传输层通信协议,它能提供高可靠性通信,像HTTP/HTTPS等网络服务都采用TCP ...

  5. 闲来无事,写个基于TCP协议的Socket通讯Demo

    .Net Socket通讯可以使用Socket类,也可以使用 TcpClient. TcpListener 和 UdpClient类.我这里使用的是Socket类,Tcp协议. 程序很简单,一个命令行 ...

  6. TCP协议下Socket的基础编程类型

    套接字的基本操作有: 创建(socket).命名(bind).侦听(listen).连接(accept).关闭(shutdown).发送(send).接受(recv). 下面逐个分析: 一.创建(so ...

  7. 基于TCP协议的socket编程

    什么是socket Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面, ...

  8. 基于网络编程 TCP协议 及 socket 基本语法

    socket是什么 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面, ...

  9. 网络编程: 基于TCP协议的socket, 实现一对一, 一对多通信

    TCP协议  面向连接 可靠的 面向字节流形式的 tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端 TCP协议编码流程: 服务器端:                 客户端 实例化对 ...

随机推荐

  1. The way to unwind the stack on Linux EABI

    I. probe the stack frame structure The original idea is to unwind the function call stack according ...

  2. Python IDLE arcpy设置环境变量

    在IDLE中 import arcpy help(arcpy) 得到的路径为: 但是在arcmap中,路径为: 说明IDLE的环境变量设置有问题: 在windows的环境变量中设置环境变量PYTHON ...

  3. iOS 线程安全--锁

    一,前言 线程安全是iOS开发中避免了的话题,随着多线程的使用,对于资源的竞争以及数据的操作都可能存在风险,所以有必要在操作时保证线程安全. 二,为什么要使用锁? 由于一个进程中不可避免的存在多线程, ...

  4. 点击图片img提交form表单

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  5. asp.net mvc easyui tree

    1.html页面代码: <div class="easyui-panel" style="padding:5px" id="powerTree& ...

  6. Spring框架的第四天(整合ssh框架)

    ## Spring框架的第四天 ## ---------- **课程回顾:Spring框架第三天** 1. AOP注解方式 * 编写切面类(包含通知和切入点) * 开启自动代理 2. JDBC模板技术 ...

  7. windows程序设计 获取显示器分辨率

    我的显示器分辨率 /*--------------------------------------------------------------------------- scrsize.c -- ...

  8. airflow中的两个参数

    'trigger_rule':'all_done','retry_delay':timedelta(),

  9. GDScript 格式化字符串

    GDScript offers a feature called format strings, which allows reusing text templates to succinctly c ...

  10. Centos7 Yum安装 PHP5.5,5.6,7.0

    默认的版本太低了,手动安装有一些麻烦,想采用Yum安装的可以使用下面的方案: 1.检查当前安装的PHP包 yum list installed | grep php 如果有安装的PHP包,先删除他们 ...