从零构建通讯器--5.2三次握手,telnet,wireshark
发布日期:2021-05-04 18:23:28 浏览次数:4 分类:技术文章

本文共 2933 字,大约阅读时间需要 9 分钟。

一:TCP连接的三次握手

tcp:可靠的,面向连接的协议

udp:不可靠的,无连接的协议
(1.1)最大传输单元MTU
MTU(Maximum Transfer Unit):最大传输单元;
MTU:每个数据包包含的数据最多可以有多少个字节;1.5K左右;
你要发送100K,操作系统内部会把你这100K数据拆分成若干个数据包【分片】,每个数据包大概1.5K之内【大概拆解成68个包】;对端重组;
这68个包各自传送的路径可能不同,每一个包可能因为路由器,交换机原因可能被再次分片;
(1.2)TCP 包头结构
a)源端口,目标端口
b)关注syn位和ack位【开/关】
c)一个tcp数据包,是可能没有包体,此时,总会设置一些标志位来达到传输 控制信息的目的;
(1.3)TCP 数据包收发之前的准备工作
//回忆日志操作的步骤:
//a)打开日志文件
//b)多次,反复的往日志文件中写信息
//c)关闭日志文件
//TCP数据包的收发也分三大步骤:
//a)建立TCP连接[connect:客户端] ,三次握手
//b)多次反复的数据收发[read/wirte]
//c)关闭TCP连接[close]
//UDP不存在三次握手来建立连接的问题。UDP数据包是直接发送出去,不用建立所谓的连接;
(1.4)TCP 三次握手建立连接的过程
在这里插入图片描述

客户端理解成一个人,服务器端理解成一个人,两个人要用电话通话:

张三:你好,李四,我是张三 [syn] ,ip,端口
李四:你好,张三,我是李四 [syn/ack]
张三:你好,李四 [ack]
//a)客户端给服务器发送 了一个SYN标志位置位的无包体TCP数据包,SYN被置位,就表示发起TCP链接,协议就这么定
//b)服务器收到了这个SYN标志位置位的数据包,服务器给客户端返回一个SYN和ACK标志位都被置位的无包体TCP数据包,协议就这么定的;
//c)客户端收到服务器发送回来的数据包之后,再次发送ACK置位的数据包,服务器端收到这个数据包之后,客户端和服务器端的TCP链接就正式建立;
//后续就可以进行数据收发了

//三次握手很大程度上是为了防止恶意的人坑害别人而引入的一种TCP连接验证机制;

1.5)为什么TCP握手是三次握手而不是二次

//网络诈骗
//110:客户端 ,你就是服务器
//伪造来电:110
//TCP之所以要三次握手,原因可能很多,但不管多少 原因,都是为了确保数据稳定可靠的收发;
//为什么要TCP三次握手最主要的原因之一:尽量减少伪造数据包对服务器的攻击;

二:telnet工具使用介绍

//是一款命令行方式运行的客户端TCP通讯工具,可以连接到服务器端,往服务器端发送数据,也可以接收从服务器端发送过来的信息;

//类似nginx5_1_1_client.c
//该工具能够方便的测试服务器端的某个TCP端口是否通,是否能够正常收发数据,所以是一个非常实用,重要,常用的工具,老师要求大家都会;
//telnet ip地址 端口号(先开启服务器)
在这里插入图片描述
在这里插入图片描述

三:wireshark监控数据包

捕捉指定Ip和端口的数据

在这里插入图片描述

(3.1)TCP断开的四次挥手

// FIN,ACK 服务器->客户端
// ACK 客户端->服务器
// FIN,ACK 客户端->服务器
// ACK 服务器->客户端
在这里插入图片描述

服务器

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#define SERV_PORT 9000 //本服务器要监听的端口号,一般1024以下的端口很多都是属于周知端口,所以我们一般采用1024之后的数字做端口号int main(int argc, char *const *argv){ //这些演示代码的写法都是固定套路,一般都这么写 //服务器的socket套接字【文件描述符】 int listenfd = socket(AF_INET, SOCK_STREAM, 0); //创建服务器的socket,大家可以暂时不用管这里的参数是什么,知道这个函数大概做什么就行 struct sockaddr_in serv_addr; //服务器的地址结构体 memset(&serv_addr,0,sizeof(serv_addr)); //设置本服务器要监听的地址和端口,这样客户端才能连接到该地址和端口并发送数据 serv_addr.sin_family = AF_INET; //选择协议族为IPV4 serv_addr.sin_port = htons(SERV_PORT); //绑定我们自定义的端口号,客户端程序和我们服务器程序通讯时,就要往这个端口连接和传送数据 serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); //监听本地所有的IP地址;INADDR_ANY表示的是一个服务器上所有的网卡(服务器可能不止一个网卡)多个本地ip地址都进行绑定端口号,进行侦听。 int result; result = bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));//绑定服务器地址结构体 result = listen(listenfd, 32); //参数2表示服务器可以积压的未处理完的连入请求总个数,客户端来一个未连入的请求,请求数+1,连入请求完成,c/s之间进入正常通讯后,请求数-1 int connfd; const char *pcontent = "I sent sth to client!"; //指向常量字符串区的指针 for(;;) { //卡在这里,等客户单连接,客户端连入后,该函数走下去【注意这里返回的是一个新的socket——connfd,后续本服务器就用connfd和客户端之间收发数据,而原有的lisenfd依旧用于继续监听其他连接】 connfd = accept(listenfd, (struct sockaddr*)NULL, NULL); //发送数据包给客户端 //write(connfd,pcontent,strlen(pcontent)); //注意第一个参数是accept返回的connfd套接字 //以下代码非常不完善,纯粹用于演示目的,完全不可以商用 char recvline[1000 + 1]; read(connfd,recvline,1000); //卡在这,从客户端收点东西 write(connfd,pcontent,strlen(pcontent)); //往客户端发送点东西 close(connfd); } //end for close(listenfd); //实际本简单范例走不到这里,这句暂时看起来没啥用 return 0;}
上一篇:从零构建通讯器--5.3TCP状态转换,TIME_WAIT详解,SO_REUSEADDR
下一篇:从零构建通讯器--5.1TCP和IP协议

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2025年04月01日 18时48分01秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

硬核观察 | 有人在比特币骗局中损失了 10 个比特币 2019-03-03
初识 Python: global 关键字 | Linux 中国 2019-03-03
在 Ubuntu 17.10 上安装 AWFFull Web 服务器日志分析应用程序 | Linux 中国 2019-03-03
基于日出和日落时间自动切换到明/暗 Gtk 主题 | Linux 中国 2019-03-03
FreeDOS 的简单介绍 | Linux 中国 2019-03-03
查看一个归档或压缩文件的内容而无需解压它 | Linux 中国 2019-03-03
极致技术探索:显卡工作原理 | Linux 中国 2019-03-03
如何在 Linux 中不使用功能键在 TTY 之间切换 | Linux 中国 2019-03-03
如何在 Ubuntu 系统中添加一个辅助 IP 地址 | Linux 中国 2019-03-03
LCTT 2018:五周年纪念日 | Linux 中国 2019-03-03
【每日安全资讯】安全研究员发现39万个网站因公开的.git repo处于危险中 2019-03-03
如何在 Ubuntu 16.04 强制 APT 包管理器使用 IPv4 | Linux 中国 2019-03-03
使用 top 命令了解 Fedora 的内存使用情况 | Linux 中国 2019-03-03
怎样解决 “sub process usr bin dpkg returned an error code 1” 错误 2019-03-03
Bat:一种具有语法高亮和 Git 集成的 Cat 类命令 | Linux 中国 2019-03-03
在 Linux 上操作目录 | Linux 中国 2019-03-03
如何禁用 Ubuntu 服务器中终端欢迎消息中的广告 | Linux 中国 2019-03-03
【每日安全资讯】一个让你用微信支付的勒索病毒 一场黑吃黑的表演 2019-03-03
极客漫画:TCP 兄弟 | Linux 中国 2019-03-03
认识存储:块、文件和对象 | Linux 中国 2019-03-03