在说这个问题之前,先说说IP协议和TCP协议

问题:IP协议能做什么?不能做什么?

我们都知道IP协议是无连接的通信协议,它不会占用两个正在通信的计算机的通信线路,这样就降低了IP对网络传输中的需求,每条线路都能同时满足许多不同的计算机需要,通过IP、消息、或者其他数据,会被分割为较小的独立的包,并通过因特网在计算机中传送,IP负责将每个包路由到它的目的地,但IP协议呢,没有做任何事情去确保数据包是按顺序发送或是否被破坏,所以IP数据包是不可靠的。需要由它的上层协议,来做出控制------》TCP协议

传输控制协议TCP简介

---》

1、面向连接的、可靠的、基于字节流的传输层通信协议

2、将应用层的数据流分割成报文段并发送给目标节点的TCP层(将数据打散)

(数据传输时,应用层向TCP发送数据流,然后TCP把数据流分割成适当长度的报文段,报文段的长度呢是受该计算机连接的网络的网路层的最大连接单元限制的,则MTU的限制。TCP把结果包,传给IP层,由它来通过网络传输给对方的TCP层)

3、数据包都有序号,对方收到则发送ACK确认,未收到则重传(怎样保证数据的有序性)

(TCP为了保证不丢失包,就给每个包一个序号,则sequence number,这个序号就保证了数据包的按序处理,对方接受到按照这个序列来按顺序来处理数据包。接收端实体对已成功接受到的包的话,就发回一个确认,则ACK确认。如果发送端实体在合理的往返时延,则TRR内未收到的话,则认为该数据已经丢失,并且会对其重传)

4、使用校验和来检验数据在传输过程中是否有误(怎样保证数据的正确性?)

(TCP用一个奇偶校验和函数来检验数据,是否有错误,在发送和接受时呢,都要计算校验和)

我们知道两个进程在计算机内部进行通信的话,有哪些方式?

1、管道

2、内存共享

3、信号量

4、消息队列等

而两个进程进行通信的前提是唯一标识一个进程,通过这个唯一标识,找到对应的进程,在本地进程通信中呢,我们可以使用pid ,但用个id的话,只是在本地是唯一而已。如果把两条进程放到两台不同的计算机上,而他们要进行通信的话呢,pid就不够用了,这样的话,就需要另外的手段了,解决的方法就是在传输层中使用协议端口号,我们知道ip地址可以唯一标识主机,而ip地址+端口可以唯一标识主机中的一个进程,这样子的话,我们可以利用ip地址+协议+端口号,去标识网络中的一个进程。在一些场景下,我们称这种模式为套节字(则socket),虽然通信的重点是应用进程,但我们只要把要传输的报文交到目的主机的某一个合适的端口,剩下的工作就由TCP来完成了。

Source Port :本机端口

Desination Port : 目标端口

Sequence Number : 序列号  4个字节  (例如:一段报文的序列号值是107,而携带的字段有100个字段,那么还有下一个报文的话,那么它的序列号是107+100=207)

Acknowledgment number :确认号  4个字节(期望收到对方收到下一个报文,第一个数据字节的序号   ,例如,B收到A发送过来的报文,其序列号是301,而数据长度为200,这表明了B正确收到了A发送的到序号为500的数据,301+200-1=500,因此B期望A下次发送过来的报文的序号是501,所以B收到了A第一次报文之后,会返回ACK为501的序号的报文给B)

Offset : 数据偏移,由于头部有可选字段,长度不固定,因此他就是指出TCP报文的数据与TCP的起始处相差多远。

Reserved:一般为0,保留域

TCP Flags: 标记位,控制位,8个标志位,每个都代表一种功能

  1、URG --->紧急指针标记,当他为1的是紧急指针有效。为0的话,可以忽略

  2、ACK--->确认序号标志,1有效,0报文中不含确认信息,忽略确认号字段

  3、PSH--->push 标志,1带有push标志数据,如果接受方接受到这个信息,应该尽快交给应用程序处理,而不是一直停留在缓冲区

  4、RST---->重置连接标志,由于主机崩溃,或者拒绝非法的报文段,或者非法连接请求

  5、SYN---->同步序列号,用于建立连接过程。在连接请求中,SYN=1,ACK=0,表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认 SYN=1和ACK=1

  6、FIN---->finish标志,用于释放连接。为1的时候,就代表发送方没有数据发送了,则关闭本方数据流

Window : 滑动窗口的大小,用来告知发送端和接受端的缓存大小,以此控制发送端的发送速率,从而达到流量控制

CheckSum : 奇偶和校验,检验TCP报文段(包括TCP数据和TCP头部),以16位计算所的,由发送端计算和存储。并由接受端进行验证。

Urgent Pointer : 紧急指针,当TCP FLAGS 为URG的时候,才有效,会显示本段报文的紧急数据的字节数

TCP Option : 可选项,长度可变,定义一些可选参数

1、为什么需要三次握手才能建立起连接呢?

为了初始化Sequence number的初始值

通信的双方都要通知对方自己的sequence number。也就是图上的x和y,这个要作为以后通信的序号,保证应用层接受到的数据不会因为网络的问题,导致数据的乱序。就是TCP会用这个序号来拼接数据。那么服务回发信息给客户端的时候(第二次握手的时候),告诉客户端知道服务器已经知道你的seq序号了。

此外在第一次握手的时候,有一个隐患。SYN的超时问题。

首次握手的隐患-----SYN超时

问题起因分析

1、Server收到Client的SYN,回复SYN-ACK的时候未收到ACK确认

2、Server不断重试直到超时,LInux默认等待63秒才断开连接(重试5次,2,4,8,16,32 共63秒)

会将服务器连接的队列SYN耗尽,让正常的请求不能得到请求(用户就感到网络好卡,没返回)

针对SYN Flood的防护措施

1、linux下,SYN队列满后,通过tcp_syncookies参数回发SYN Cookie(TCP会通过原地址端口,目标地址端口,时间戳,打造一个特别sequence number回发回去,这个seq简称SYN Cookie)

2、若为正常连接则Client会回发SYN Cookie ,直接建立连接

问题:建立连接后,Client出现故障怎么办?

保活机制

  1、向对方发送保活探测报文,如果未收到响应则继续发送(在一段时间,我们成为保活时间,keepalive time ,在这段时间内,连接处于非活动状态,开启保活功能的一段,会向对方发送保活探测报文)

  2、尝试次数达到保活探测仍未收到响应则中断连接

说说TCP的三次握手的更多相关文章

  1. 简析TCP的三次握手与四次分手

    TCP是什么? 具体的关于TCP是什么,我不打算详细的说了:当你看到这篇文章时,我想你也知道TCP的概念了,想要更深入的了解TCP的工作,我们就继续.它只是一个超级麻烦的协议,而它又是互联网的基础,也 ...

  2. TCP的三次握手(建立连接)和四次挥手(关闭连接)

    参照: http://course.ccniit.com/CSTD/Linux/reference/files/018.PDF http://hi.baidu.com/raycomer/item/94 ...

  3. TCP协议三次握手和四次挥手

    http://www.cnblogs.com/rootq/articles/1377355.html TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对 ...

  4. HTTP协议中TCP的三次握手,四次挥手总结

    建立TCP需要三次握手才能建立,而断开连接则需要四次挥手.整个过程如下图所示: 先来看看如何建立连接的. 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资 ...

  5. TCP协议三次握手

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

  6. 简析TCP的三次握手与四次挥手

    TCP是什么? 具体的关于TCP是什么,我不打算详细的说了:当你看到这篇文章时,我想你也知道TCP的概念了,想要更深入的了解TCP的工作,我们就继续.它只是一个超级麻烦的协议,而它又是互联网的基础,也 ...

  7. 简析TCP的三次握手与四次分手【转】

    转自 简析TCP的三次握手与四次分手 | 果冻想http://www.jellythink.com/archives/705 TCP是什么? 具体的关于TCP是什么,我不打算详细的说了:当你看到这篇文 ...

  8. 【转载】简析TCP的三次握手与四次分手

    最近在补习HTTP协议相关知识点,看到这篇讲得不错,所以转载收藏一下,同时也分享给大家.原文地址:http://www.jellythink.com/archives/705,版权归原作者所有. TC ...

  9. TCP协议—三次握手四次挥手的原理<转>

    三次握手四次挥手的原理   TCP是面向连接的,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接.在TCP/IP协议中,TCP 协议提供可靠的连接服务,连接是通过三次握手进行初始化的.三 ...

  10. TCP的三次握手与四次挥手

    TCP的三次握手与四次挥手 一.TCP(Transmission Control Protocol 传输控制协议) TCP是面向对连接,可靠的进程到进程通信的协议 TCP是提供全双工服务,即数据可在同 ...

随机推荐

  1. linux下安装QQ等EXE文件

    安装好linux系统后,发现linux很多自带的软件用起来很不习惯,于是去网上下载QQ等在Windows下经常使用的exe文件. 发现这些文件无法安装,在网上找了一些解决办法,须下载wine,然后才可 ...

  2. VS 远程部署程序

    第1步 https://www.cnblogs.com/hydor/p/6604053.html 第2步 http://www.cnblogs.com/potential/p/3751426.html ...

  3. Unity T4M 中文讲解

    http://blog.csdn.net/tianmao111/article/details/46482963 现在在u3d圈里流行了一种地形转换器(或者叫编辑器吧),但是经查阅之后,似乎还没有中文 ...

  4. Unity 自动寻路Navmesh之跳跃,攀爬,斜坡

    在之前的几篇Blog总,我们已经系统学习了自动寻路插件Navmesh的相关概念和细节.然而,如果要做一个场景精美的手游,需要用到各种复杂的场景地形,而不仅仅是平地上的自动寻路.今天我们将通过一个完整的 ...

  5. 基础篇-密码文件.pgpass

    密码文件包含字段 host:port:dbname:user:password port和dbname可以使用*号作通配符 在*nix系统中 ~/.pgpass 在windows系统中 %APPDAT ...

  6. MySQL无法启动Couldn't find MySQL server (/usr/bin/mysqld_safe)解决办法(来源网络)

    MySQL无法启动Couldn't find MySQL server (/usr/bin/mysqld_safe) 启动的时候,报上述错误,从这个报错来看,多半是因为读取到了另外的my.cnf导致的 ...

  7. Luogu P2341 [HAOI2006]受欢迎的牛 SCC缩点

    把强连通分量缩点,如果有且仅有一个出度为0的强连通分量,那么答案就是他的size:如果有多个入度为0的,那么没有明星牛. #include<cstdio> #include<iost ...

  8. loj6198谢特 后缀数组+并查集+Trie

    先把问题放在后缀数组上考虑 已知两个数组a b,求min(a[i],...,a[j])+(b[i]^b[j])的最大值 套路题 初始每个点都是一个小连通块 把a按从大到小的顺序加入,计算当前加入边作为 ...

  9. beanshell解析json(从简单到复杂)

    使用beanshell 解析单层Json: Json 数据如下: { "status":200, "code": 0, "message": ...

  10. 省厅报件7.0 读取mdb 生成xml 文件

    using System;using System.Collections.Generic;using System.Data;using System.Data.OleDb;using System ...