1.握手

说明:

  下面涉及 FIN,SYN,ACK之类数据时,都是由TCP服务收发,

  涉及 accept, listen 之类api,都是 应用进程 完成。

  都统一使用 客户端,服务端描述,请自行分辨。

(1)首先描述下3次握手,TCP协议做了什么。

客户端,主动打开,发送自己的序列号SYNj,并期待对方回复ACKj+1

服务端,被动打开,接送自己的序列号SYNk和ACKj+1,并期待对方回复ACKk+1

客户端,接收对方ACK,己方打开完成,接收对方SYN,发送ACKk+1

服务端,接收对方ACK,己方打开完成。

分析下:

  首先打开分为,被动打开和主动打开。

  当接收到对方的ACK,则己方打开完成,则可以使用socket进行读写操作,但并不保证正常。

(2)结合 系统调用分析三次握手

客户端,listen,进行被动打开

服务端,connect ,进行主动打开,发送SYNj(如果乙方此时没有listen 完成,则connect 失败)

客户端,回复SYNk + ACKj+1, 应用层无任何变化。

服务端,收到 ACKj+1 + SYNk,并回复 ACKk+1, 甲方打开完成,connect 返回。

客户端,收到ACKj+1,可以进行 read,write。

服务端,accept,如果乙方没有收到 SYNj 则会阻塞,否则返回

服务端,收到ACKk+1,可以进行 read, write

总结下:

  从应用层角度,三次握手的开始,

    主动方,始于 connect,结束于 connect

    被动方,始于 listen ,结束于 listen

  accept 是被动方处理已经完成握手的主动方。

(3)实验

client

if  (0 > (connect(fd, (struct sockaddr *)&addr, sizeof(addr)))) {
perror("connect");
exit(-1);
} printf("success to connect\n"); write(fd, "hello world", strlen("hello world")); printf("write over\n"); close(fd);

server

        if (0 > listen(fd, 10)) {
perror("listen");
exit(-1);
} #if 1
printf("sleep for delay accept...\n");
sleep(5);
printf("sleep over\n");
#endif if (0 > (c_fd = accept(fd, (struct sockaddr *)&c_addr, &len))) {
perror("accept");
exit(-1);
} printf("success to accept\n"); while ((nbytes = read(c_fd, msg, MAX_READ))) {
msg[nbytes] = 0;
printf("%s", msg);
}
printf("\n"); if (0 > (nbytes = write(c_fd, "bye", 3))) {
perror("write");
exit(-1);
} printf("i have see bye\n"); close(fd);
close(c_fd);

实验结果

sleep for delay accept...
sleep over // 这里客户端已经通信结束,程序退出
success to accept
hello world
i have see bye

可以发现,客户端虽然已经挥手,但是服务端仍然视为握手完成,并正常的进行通信。

用netstat查看

可以发现,客户端进程虽然死掉,但打开的TCP服务并没有关闭,他在等待四次挥手完成。

因此服务端,虽然延迟处理,却依旧能正常处理通信。、

2.四次挥手

客户端,主动关闭,close,发送 FINm

服务端,被动关闭,接收FINm,发送ACKm+1

一段时间后,服务端,调用close,发送FINn

客户端,接收FINn,发送ACKn+1

总结下:

  当服务端接收到FIN时,注意,所有的TCP数据都由TCP服务处理,服务端的TCP收到FIN,并向服务端进程发送文件结束符EOF。

  EOF按照顺序在通信数据后面。

  当服务端进程read获得EOF,适时主动调用close,以发送 FINn。

  

  在客户端close,服务端没有close的阶段,称为 半关闭。

  这时,服务端进程可以发送数据,数据会交给客户端TCP服务,但不会上交给应用层。所以客户端进程是否存在,没关系。

UNP——第二章,TCP握手与挥手分析的更多相关文章

  1. TCP 握手和挥手图解(有限状态机)

    1.引言 TCP 这段看过好几遍,老是记不住,没办法找工作涉及到网络编程这块,各种问 TCP .今天好好整理一下握手和挥手过程.献给跟我一样忙碌,找工作的童鞋,欢迎大神批评指正. 2.TCP 的连接建 ...

  2. 第二章 TCP/IP 基础知识

    第二章 TCP/IP 基础知识   TCP/IP  transmission control protocol and ip internet protocol 是互联网众多通信协议中最为著名的.   ...

  3. 抓包分析 TCP 握手和挥手

    前言 首先需要明确的是 TCP 是一个可靠传输协议,它的所有特点最终都是为了这个可靠传输服务.在网上看到过很多文章讲 TCP 连接的三次握手和断开连接的四次挥手,但是都太过于理论,看完感觉总是似懂非懂 ...

  4. UNP——第二章,端口号,套接字对,TCP,UDP输出

    1.端口号 端口号用于区分使用相同协议的进程. TCP69 与 UDP69 是不同的. 端口号范围 0 - 65535, 其中 0- 1023 是保留端口. 2.套接字对 TCP服务通过套接字对,唯一 ...

  5. UNP——第二章,TCP状态,TIME_WAIT

    状态可以用 netstat 验证 加粗线为 数据交换. 可以看出,TCP在 建立连接和 关闭连接,耗费资源, 因为UDP只需要两次数据通信即可. 但UDP没有可靠传输,和流量控制. 上面协商的MSS为 ...

  6. CCNA第二章TCP/IP简介考试要点学习笔记

    1.描述网络是如何工作的     DoD过程/应用层 -- OSI应用.表示和会话层(定义了结点到结点的应用通信协议以及对用户界面规范的控制): DoD主机到主机层 -- OSI传输层(保证了数据包的 ...

  7. UNP——第二章,常见协议概述

    1.为什么要了解协议 程序员与协议合作,完成应用. 了解协议是为了了解协议完成了什么,提供了什么服务,自己还应该做什么. 2.从协议的角度,套接字是什么 套接字是协议的接口, IP套接字,代表可使用I ...

  8. [Maven实战-许晓斌]-[第二章]-2.3安装目录分析

    bin boot conf settings.xml非常重要 这个是maven安装包自带的settings.xml 通常我们会放在习惯路径,C:\Users\admin\.m2\下面 即  用户路径\ ...

  9. TCP/IP三次握手四次挥手分析

    流程图 全部11种状态 客户端独有的:(1)SYN_SENT (2)FIN_WAIT1 (3)FIN_WAIT2 (4)CLOSING (5)TIME_WAIT 服务器独有的:(1)LISTEN (2 ...

随机推荐

  1. python接口测试之日志功能

    之前在简书中看了一篇关于日志功能的文档,供大家参考:https://www.jianshu.com/p/62f7b49b41e7 Python通过logging模块提供日志功能,所以直接导入即可 im ...

  2. 【矩阵乘优化DP】涂色游戏

    题目大意 用 \(p\) 种颜色填 \(n\times m\) 的画板,要求任意相邻两列的颜色数都不少于 \(q\) ,求方案数. 数据范围 \(1\leq n\leq 100,1\leq m\leq ...

  3. 【思维】Luogu P3941 入阵曲

    题目大意 洛谷链接 给出一个矩阵和 \(K\) ,问有多少子矩阵中的元素和能整除 \(K\). 数据范围 \(2\leq n,m\leq 400\),\(0\leq K\leq 10^6\). 思路 ...

  4. 51Nod 最大M子段和系列 V1 V2 V3

    前言 \(HE\)沾\(BJ\)的光成功滚回家里了...这堆最大子段和的题抠了半天,然而各位\(dalao\)们都已经去做概率了...先%为敬. 引流之主:老姚的博客 最大M子段和 V1 思路 最简单 ...

  5. Privileged Permission开机授权时序图 SourceCode android-10.0.0_r36

    Privileged Permission开机授权时序图 | SourceCode:android-10.0.0_r36 | Author:秋城 | v1.1SystemServerSystemSer ...

  6. Spring官方都推荐使用的@Transactional事务,为啥我不建议使用!

    GitHub 17k Star 的Java工程师成神之路,不来了解一下吗! GitHub 17k Star 的Java工程师成神之路,真的不来了解一下吗! GitHub 17k Star 的Java工 ...

  7. java刷题时常用容器详解

    当初学java时,只是简单的把java基础知识过了一遍就跑去刷题了,很多知识都是在刷题的过程中慢慢加深理解的. 由于每次刷题时,刷到与容器有关的我基本上都跑去百度了,例如百度一下:java中List的 ...

  8. 案例>>>用绝对值的方法打印出菱形

    import java.util.Scanner; public class Test { public static void main(String[] args) { Scanner sc = ...

  9. java实现单链表、栈、队列三种数据结构

    一.单链表 1.在我们数据结构中,单链表非常重要.它里面的数据元素是以结点为单位,每个结点是由数据元素的数据和下一个结点的地址组成,在java集合框架里面 LinkedList.HashMap(数组加 ...

  10. exe打包成安装文件(界面美观)

    前言 在开发windows桌面应用过程中,软件交付时,一般都是交付安装包. 安装文件的优点 显得更正规,安装界面也可展示软件特点介绍,可自动生成桌面图标等: 安装包体积要比软件小,方便下载. 探索之路 ...