本节主要研究三次握手出现的一些异常情况和编程相关的知识:

上一节分析了三次握手的过程,本节会回答一些三次握手的小问题,然后利用linux系统调用实践一下简单的网络的编程。

三次握手的常见问题

Q 向一个不存在但合法的公网IP任意端口发送SYN包会出现什么情况?

A 返回ICMP主机不可达。

Q 向一个存在的IP但未绑定的端口发送SYN包会出现什么情况

A 返回 TCP RST segement

Q 第一个SYN包丢失了,客户机会采取什么动作?

A 重传,重试几次后失败,连接失败

Q 为什么建立连接过程不是四次

A Server的SYN &ACK放到一个TCP segment中传给了client

Q 什么时候将会出现4次的 TCP segment交互

A 连接同时断开

Q 第二个SYN2(SYN2 + ACK1)丢失了将会出现什么情况。

A Client收不到SYN2而不发送ACK2, Server端超时重传。

Q:ACK2丢失了将会怎么样

A: 如果出现了大量ACK丢失,未完成的队列就会出现满的状态,从而不能接受SYN1,这就是dos攻击。

三次握手编程实践

参考这里:编程实践



connect 函数能为客户端主动连接服务器,建立连接通过三次握手,而这个连接的过程是由内核完成的,不是由函数完成的。connect函数默认会一直阻塞,知道三次握手成功或者超时失败菜户返回。

对于服务器是被动连接的TCP三次握手也不是由这个函数完成的,listen作用仅仅告诉内核一些信息。而且listen函数不会阻塞,它主要做的事情是将套接字和对应度列的长度告诉linux内核,然后listen函数就结束了。

当由一个客户端主动连接,linux内核就自动完成TCP的三次握手。

三次握手的连接队列

listen()函数的第二个参数(backlog)的作用, 告诉内核连接队列的长度。为了更好理解backlog参数,我们必须认识到内核任何一个给定的监听套接口维护一个队列,该队列由两部分构成,分别是完成连接队列,未完成连接队列:

  1. 未完成连接队列,每当服务端收到有一个SYN分节,就会将客户端放入未完成连接队列,而服务器处于 SYN_RECV 状态
  2. 已完成连接队列,当客户端和服务器彻底完成三次握手的过程,客户端从未完成的连接队列升级成为已完成的连接队列,并从未完成的连接队列中清空该客户端, 这些套接口处于ESTABLISHED状态

当来自客户端的SYN到达时, TCP未完成连接队列中创建一个新项,然后知道三次握手的第三个分节到达服务器或者超时为止。

如果三次握手正常完成, 该项就从未完成连接队列移到已完成的队列的队尾。

backlog参数历史上被定义为上面两个队列的大小之和。这个数值默认是128.

accept()函数的功能是从连接队列的头部去除一个已经完成的连接,如果这个队列没有已经完成的连接,accept()函数就会阻塞,知道去除队列中已经完成的用户连接为止。

如果服务器不能及时调用accept函数及时的取走已完成的连接,队列满了会怎样。队列满了以后,服务器不会再对新建立的连接syn进行应答,所以客户端的connect就会返回ETIMEDOUT,但是linux不会这样,只是会延迟收到。具体代码参看编程实践

这个连接队列究竟是怎么工作的有待研究。

TCP协议之三次握手(二)的更多相关文章

  1. TCP协议之三次握手与四次挥手

    TCP协议是TCP/IP体系中核心一个协议,该协议比起IP协议,ICMP协议,UDP协议都更复杂,因此这篇文章主要分析TCP协议在建立连接和断开连接的时候,状态转移以及报文段的内容. 下面,先放一张T ...

  2. TCP协议之三次握手四次挥手

    一.TCP协议简述 TCP协议位于传输层用来建立传输数据的通道以及传输数据,那么在这一层的tcp协议就涉及到客户端与服务端通信的连接,数据的传输.关闭连接. 通信的连接使用的就是客户端与服务端的三次握 ...

  3. 软件开发架构介绍||OSI七层协议之物理层、数据链路层、网络层、传输层(mac地址、ip协议、断开协议、tcp协议之三次握手四次挥手)

    一.网络编程 软件开发架构 C/S架构 C:客户端 想体验服务的时候才会去找服务端体验服务 S:服务端   24小时不间断的提供服务,即时监听,随时待命 B/S架构 B:浏览器    想体验服务的时候 ...

  4. TCP协议三次握手

    TCP协议三次握手过程分析 TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: ...

  5. TCP 协议三次握手过程分析

    TCP 协议三次握手过程分析 TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: ...

  6. TCP协议三次握手与四次挥手通俗解析

    TCP/IP协议三次握手与四次握手流程解析 一.TCP报文格式 TCP/IP协议的详细信息参看<TCP/IP协议详解>三卷本.下面是TCP报文格式图: 图1 TCP报文格式 上图中有几个字 ...

  7. TCP协议三次握手与四次挥手详解

    在计算机网络的学习中TCPi协议与Http协议是我们必须掌握的内容,其中Tcp协议属于传输层,而Http协议属于应用层,本博客主要讲解Tcp协议中的三次握手与四次挥手,关于Http协议感兴趣的可以参看 ...

  8. Tcp协议三次握手四次挥手

    一.什么是TCP TCP(Transmission Control Protocol 传输控制协议)是一种面向连接(连接导向)的.可靠的. 基于IP的传输层协议.TCP在IP报文的协议号是6. 二.什 ...

  9. TCP协议三次握手和四次握手

    前言 先说一下IP协议和TCP协议,IP协议是无连接的通信协议,IP不会占用两个设备之间通信的线路,IP实际上主要负责将每个数据包路由至目的地,但是IP协议并没有能够确保数据包是否到达,传过去的数据包 ...

  10. 网络编程 TCP协议:三次握手,四次回收,反馈机制 socket套接字通信 粘包问题与解决方法

    TCP协议:传输协议,基于端口工作 三次握手,四次挥手 TCP协议建立双向通道. 三次握手, 建连接: 1:客户端向服务端发送建立连接的请求 2:服务端返回收到请求的信息给客户端,并且发送往客户端建立 ...

随机推荐

  1. Python语言课程实验报告

    Python语言基础实验 一.实验目的和要求 1.了解Python的基本数据类型: 2.学习了解变量的定义与使用: 3.学会使用Python运算符: 4.掌握数据类型的实际应用. 二.实验环境 软件版 ...

  2. kunkun

    <html> <head> <title>cxk</title> </head> <body><h1>给设计师:字体 ...

  3. Burp学院-信息泄露

    1.Information disclosure in error messages错误消息中的信息泄露 GET /product?productId=1 发送到Repeater. 修改product ...

  4. docker 搭建 nginxconfig.io 文档

    docker镜像仓库 https://hub.docker.com/r/devopstestlab/nginxconfig.io 获取镜像 docekr pull devopstestlab/ngin ...

  5. 基于MIPI的高性能成像系统

    硬件组件Digilent Genesys ZU × 1 (FPGA平台) Digilent PCAM5 × 1 (MIPI摄像头) 软件组件AMD-Xilinx Vivado 设计套件 介绍从简单的嵌 ...

  6. 【Pr】如何裁剪视频得页面?

    [Pr]如何裁剪视频得页面? 选择视频轨道 | 效果 | 裁剪(可以搜索) | 调整上下左右需要裁剪的大小 | 选择缩放,去掉黑边

  7. Ubuntu20.04安装PEA软件

    PEA软件可用于实时精密卫星钟差估计,精密卫星定轨,精密单点定位,电离层建模以及DCB估计等. Ginan开发人员推荐使用Ubuntu18.04或Ubuntu20.04搭建,本文使用Ubuntu20. ...

  8. nanoPi R1 资料

    eflasher脱机烧写 在命令行终端中通过执行下列命令进行烧写: $ su root $ eflasher root 用户的密码是 fa.   串口登录 控制台波特率 115200

  9. 通过系统函数分配内存sbrk/sbrk

    #include <unistd.h> #include <stdio.h> int main(void) { printf("================brk ...

  10. ksfitappUI自动化(准备+安装环境)

    一.原理+安装 https://blog.csdn.net/weixin_30624825/article/details/94803252 https://www.kancloud.cn/guanf ...