Linux网络实验

netstat

netstat -natp
# n 是直接获取IP而不是域名
# a 所有的socket链接
# t tcp
# p 显示进程的名字以及pid

tcpdump

tcpdump 
# 打印所有经过网络接口的数据包的头信息,也可以使用-w选项将数据包保存到文件中,方便以后分析。
# 监控eth0接口的网络情况

lsof

lsof -p pid
# 显示Linux系统当前已打开的所有文件列表 
# 可以用来查看监听的文件描述符

strace

追踪后面的可执行程序的系统调用,会输出一些文件,查看文件里面就可以知道执行的一些具体的系统调用。

strace -ff -o out /usr/java/javasdk/bin/java TestSocket

例如请求到来的时候会新建一个线程,执行clone方法

man

1617966655160-5fe5a292-9217-4780-9089-30f16c263e2e.png

建立连接与接收数据(唯一连接-->唯一四元组-->唯一文件描述符)(内核握手与用户accept)

开启服务端,不accept,只是开启端口

开启客户端,客户端连接服务端,三次握手建立sockcet连接,开辟资源(建立了文件描述符来描述这个四元组连接,一个四元组对应的文件描述符FD是唯一的),发送数据之后,由于服务端没有accept,所以服务端是由内核先接受在缓冲里面,服务端accept之后就可以获取数据。

四元组可以让连接变得清晰和唯一,所以服务端只需要一个固定的端口就可以唯一标识每一个连接。

有没有执行accept 就是这个四元组有没有被领走。

65535:四元组只要不一样就可以,下面的唯一不一样的就是服务端的端口,所以我们在启动服务的时候不能端口号冲突,否则分不清。

1617931245821-dea53938-dfaf-4dba-bfa0-0acdd6ee7b43.png1617931285245-16522c93-5031-42c7-a026-035b45d4e6f3.png

1617931925659-157ae283-d1fb-4030-8acb-3a57a7462174.png

BACK_LOG以及buffer导致连接失败以及内核数据遗失

内核会不会帮你无限缓存所有的连接,无限四元组,不会。

  • BACK_LOG : 限制连接数,超过之后就不会接收了!
  • buffer : 是限制某一个连接最大传输的数据。达到限制大小内核就不会接受,后面的都会丢弃。使用accept开始接受的时候只能得到之前发的数据

1617932225019-9c179888-bde8-47e9-91c6-1461bd83a9a3.png

1617932419229-fe61f3af-fb4f-4d60-96a5-bccbd821deaa.png

1617932647543-2d96fdae-b5ff-4543-becf-640f2716e961.png

上面记录一下,后面就会失败消失

TIMEOUT

accept之后,等多少秒会抛异常,阻塞会抛异常。保证一个socket不消耗资源,连上不发东西。

抓包三次握手

nc

MTU:1500Byte,1.5KB,整个数据包的大小

1617933215278-c944028c-baf9-4725-ab7d-52ab2e54eef7.png

MSS:真实数据的大小,去除固定的请求头的大小

自己发送序列号seq,窗口大小(流式计算)

1617933393696-1fd5cbcc-c28d-4d22-8be4-737a149bae06.png

对方回复seq+1,

三次握手之后会协商一个窗口的大小,最初起始客户端窗口是14600,之后服务端窗口的大小是1448,之后的最终协商的窗口大小是115

服务端跑起来和accept是两回事。

keepalive

双方建立连接之后好久不说话的话,

tcp(两小时)和http(应用自己定义)都是有的,两边会发一些数据,为了后续使用维持。

posted on 2025-10-12 21:35  chuchengzhi  阅读(10)  评论(0)    收藏  举报

导航

杭州技术博主,专注分享云计算领域实战经验、技术教程与行业洞察, 打造聚焦云计算技术的垂直博客,助力开发者快速掌握云服务核心能力。

褚成志 云计算 技术博客