文章目录

  • Tcp连接
    • 三次握手
      • 为什么要三次
    • 四次分手
    • 光说不练,假把式
      • 三次握手、四次分手抓包
    • 三次握手到四次分手是不可被分割的最小粒度
  • Socket
    • 文件描述符
      • 获取输入输出流
    • socket套接字

本文学习笔记来源B站 牛皮了,头一次见有清华大佬把TCP,NIO,epoll一直到netty解释的这么明白

Tcp连接

Tcp是传输控制层协议,协议就是一个约束,约定双方进行沟通的方式,该层有两层协议:UDP、TCP,走到这一层的时,使用哪种协议进行传输就已经定了,在这我们只讨论TCP。
什么是TCP协议:面向连接的、可靠的协议,面向连接,什么是连接,这个“连接”是个什么东西,虚渺,怎么理解它,接着往下走。
想知道什么是连接,首先那么我们必须要理解TCP的三次握手、四次分手。

上面都是用户空间操作的,用户空间层,在忙着完成http协议的,而怎么通信的呢,只要告诉它要跟谁通信,那用户空间的应用层会调用内核层的所有环节,所以它于是两个环节。

三次握手

简易图如下:


syn:synchronous
ack:acknowledge 告知已收到的意思

为什么要三次

为什么要三次呢,前两次客户端已经明确了,能去服务端,而且服务端还能基于请求进行返回,那为啥还要第3次呢:其实最后一次的握手就要站在服务端一面,服务端能收到别人发来的,那么客户端面向我服务端的输入是通的,虽然我给客户端回了一个数据包,但是服务端不知道它收没收到啊,所以服务端还要等客户端的一个确认,所以,3次握手之后,这样双方才能确认输入输出都是通的

1.客户端发送请求至服务端,在这一步,服务端收到了客户端的请求,也只能表
示客户端与服务端的单向通信是连通的。
2.服务端收到客户端的请求,并响应。服务端能收到请求,但是客户端不知道你
有没有收到,所以你得告诉客户端我收到了,发送一个ack至客户端。而且,同样
的,你发我我能收到,那我发给你,你能收到吗?所以,发送syn+ack
3.客户端返回ack给服务端,客户端收到服务端的ack,知道了我跟服务端是通
的,然后再返给服务端一个ack,服务端收到ack之后,只能知道,喔,我发出去
的,你也能收到

当时我在理解这个的时候,因为没有对ack的正确认知,导致一直不理解、想不通:其实ACK只是确认收到你的数据包,并不代表任何意思,并不是说给了你ACK响应了,就表示我同意了,并不是的。它只是确认收到了你的数据包而已。意思要主动说出来,你想要干嘛,自己主动说出来,所以要3次握手。

至此,3次握手完成,其实这3次握手,就是在确认双向连接是否能连通,在3次握手之后,两端会有资源的开辟,代表为对方服务,来完成后续的服务,当完成资源的开辟之后,上面所谓的“连接”就有了,这就是所谓面向的连接,这个连接不是物理的,是两端对称的资源。(此前一直以为,面向连接就是两根网线能连通, ̄□ ̄||)

可靠的传输:三次握手建立了连接,三次握手中的ack确认机制保证了可靠的传输

三次握手需要上图中的内核空间的4层来完成,具体怎么传、传到那,是网络、链路…他们干的事,软件是工程学,是分层的,层与层之间是依赖的,不能一层全部活给干了,不便于扩展及维护,如同开发中的分层似的。

四次分手

理解了三次握手,那么四次分手,自然一说就能明白。
三次握手,是为了双方开辟资源,抛出线程,可靠传输,响应对方,而分手为什么要四次呢,因为分手是释放资源,必需要双方都确定都不发送或接收数据了,这个时候才能释放,简易图:

Fin:finish,就是要表达我想要结束的意思。

  1. 客户端发送想要结束的包
  2. 服务端对结束的包给客户端做出响应
  3. 服务端再次发送数据包。服务端是不是也想要停止呢,主动说出来,当它认为确实可以断开了,没数据传输了,那就结束吧,也发送一个结束包,给客户端
  4. 客户端对服务端的结束包做出响应,好的 我收到了

与三次握手的区别在于多了第三步,需要双方都确认finish了,才能断开,这也再啰嗦一句:ACK只是确认你的数据包,并不代表任何意思,意思要主动说出来,你想要干嘛,自己说出来。

光说不练,假把式

抓包看证据,抓包命令,如果没有,需要安装一下:

tcpdump -nn -i eth0 prot 80 回车之后,开始监听(需要有root权限)
-nn 是把抓到数据包中的ip、端口号全都变成数值显示
-i 是抓那个接口。抓eth0网卡,抓数据包中端口号为80 的。

如果电脑有多个网卡,需要确认你测试的时发出去的访问连接是通过你监听的那块网卡走出去的。或者你就把多余的网卡down掉,只保留你监听的那个网卡,通过命令down掉:ifconfig eth1 down。
down掉之后,你还要确定有没有网关能让你的数据包出去,如果没有,则添加一个网关:

如果设置虚拟机,没有设置root用户,但是每台机器都会有root用户,那么密码你的用户的密码

三次握手、四次分手抓包

tcpdump -nn -i eth0 port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes19:06:02.569336 IP 192.168.111.131.46015 > 180.101.49.11.80: Flags [S], seq 676009814, win 14600, options [mss 1460,sackOK,TS val 15141229 ecr 0,nop,wscale 6], length 0
(我们本地的一个随机端口号192.168.111.131.46015,访问百度的80端口180.101.49.11.80,想要建立连接,数据包长度length 为0,现在还没发送数据,只是在三次握手)
19:06:02.648857 IP 180.101.49.11.80 > 192.168.111.131.46015: Flags [S.], seq 115756544, ack 676009815, win 64240, options [mss 1460], length 0
百度回了一个ack:S. +后面的ack,数据包长度依然为0
19:06:02.648958 IP 192.168.111.131.46015 > 180.101.49.11.80: Flags [.], ack 1, win 14600, length 0
客户端给百度回了一个ack,现在三次握手结束,建立连接(两端开辟资源)
是传输控制层控制的,所以数据包长度都为019:06:02.649284 IP 192.168.111.131.46015 > 180.101.49.11.80: Flags [P.], seq 1:167, ack 1, win 14600, length 166
本地发送数据给百度,数据长度为166,那个P 的意思是告诉百度,你要立刻处理,不要停留,因为我已经没有什么可发的了
19:06:02.649717 IP 180.101.49.11.80 > 192.168.111.131.46015: Flags [.], ack 167, win 64240, length 0
百度回一个ack19:06:02.723199 IP 180.101.49.11.80 > 192.168.111.131.46015: Flags [P.], seq 1:1441, ack 167, win 64240, length 1440
百度处理完上面的请求,给客户端返回一个长度为1440的包
19:06:02.723245 IP 192.168.111.131.46015 > 180.101.49.11.80: Flags [.], ack 1441, win 17280, length 0
客户端给百度一个大小为0的ack
19:06:02.725712 IP 180.101.49.11.80 > 192.168.111.131.46015: Flags [P.], seq 1441:2782, ack 167, win 64240, length 1341
然后百度又给返回一个1341的数据包
19:06:02.725761 IP 192.168.111.131.46015 > 180.101.49.11.80: Flags [.], ack 2782, win 20160, length 0
客户端依然回了百度一个ack
一个发生了4步,分别是两次交互,1440+1341就是整个页面的大小字节数,为啥要分两次传输呢,是因为数据包大小是受到限制的,切割成包的,一个包的大小1460个字节,分几波发送。19:06:02.726178 IP 192.168.111.131.46015 > 180.101.49.11.80: Flags [F.], seq 167, ack 2782, win 20160, length 0
然后,客户端发送给百度,我想结束了,想断开了
19:06:02.726689 IP 180.101.49.11.80 > 192.168.111.131.46015: Flags [.], ack 168, win 64239, length 0
百度回个ack,我知道了,但是我想不想断开,我再想想
19:06:02.776867 IP 180.101.49.11.80 > 192.168.111.131.46015: Flags [FP.], seq 2782, ack 168, win 64239, length 0
然后,百度想了想,你个负心人,断开就断开,拜拜
19:06:02.776928 IP 192.168.111.131.46015 > 180.101.49.11.80: Flags [.], ack 2783, win 20160, length 0
最后,客户端回给百度一个ack

每次交互,都会有一次ack,再啰嗦一句。。。ack只是表示我收到了,没有任何意思

如果想看报文的具体信息,那么就在tcpdump命令中加个参数,可以看到每次发送报文的内容:
tcpdump -nn -X -i eth0 port 80,以下内容可忽略:

[root@bogon test]# tcpdump -nn -X -i eth0 port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
19:43:31.180092 IP 192.168.111.131.47860 > 180.101.49.12.80: Flags [S], seq 2597667236, win 14600, options [mss 1460,sackOK,TS val 17389839 ecr 0,nop,wscale 6], length 00x0000:  4500 003c 18ab 4000 4006 0c74 c0a8 6f83  E..<..@.@..t..o.0x0010:  b465 310c baf4 0050 9ad5 41a4 0000 0000  .e1....P..A.....0x0020:  a002 3908 0785 0000 0204 05b4 0402 080a  ..9.............0x0030:  0109 590f 0000 0000 0103 0306            ..Y.........
19:43:31.226570 IP 180.101.49.12.80 > 192.168.111.131.47860: Flags [S.], seq 7361780, ack 2597667237, win 64240, options [mss 1460], length 00x0000:  4500 002c 00f5 0000 8006 243a b465 310c  E..,......$:.e1.0x0010:  c0a8 6f83 0050 baf4 0070 54f4 9ad5 41a5  ..o..P...pT...A.0x0020:  6012 faf0 9a64 0000 0204 05b4 0000       `....d........
19:43:31.226605 IP 192.168.111.131.47860 > 180.101.49.12.80: Flags [.], ack 1, win 14600, length 00x0000:  4500 0028 18ac 4000 4006 0c87 c0a8 6f83  E..(..@.@.....o.0x0010:  b465 310c baf4 0050 9ad5 41a5 0070 54f5  .e1....P..A..pT.0x0020:  5010 3908 740a 0000                      P.9.t...
19:43:31.226847 IP 192.168.111.131.47860 > 180.101.49.12.80: Flags [P.], seq 1:167, ack 1, win 14600, length 1660x0000:  4500 00ce 18ad 4000 4006 0be0 c0a8 6f83  E.....@.@.....o.0x0010:  b465 310c baf4 0050 9ad5 41a5 0070 54f5  .e1....P..A..pT.0x0020:  5018 3908 e604 0000 4745 5420 2f20 4854  P.9.....GET./.HT0x0030:  5450 2f31 2e31 0d0a 5573 6572 2d41 6765  TP/1.1..User-Age0x0040:  6e74 3a20 6375 726c 2f37 2e31 392e 3720  nt:.curl/7.19.7.0x0050:  2869 3338 362d 7265 6468 6174 2d6c 696e  (i386-redhat-lin0x0060:  7578 2d67 6e75 2920 6c69 6263 7572 6c2f  ux-gnu).libcurl/0x0070:  372e 3139 2e37 204e 5353 2f33 2e31 342e  7.19.7.NSS/3.14.0x0080:  302e 3020 7a6c 6962 2f31 2e32 2e33 206c  0.0.zlib/1.2.3.l0x0090:  6962 6964 6e2f 312e 3138 206c 6962 7373  ibidn/1.18.libss0x00a0:  6832 2f31 2e34 2e32 0d0a 486f 7374 3a20  h2/1.4.2..Host:.0x00b0:  7777 772e 6261 6964 752e 636f 6d0d 0a41  www.baidu.com..A0x00c0:  6363 6570 743a 202a 2f2a 0d0a 0d0a       ccept:.*/*....
19:43:31.227220 IP 180.101.49.12.80 > 192.168.111.131.47860: Flags [.], ack 167, win 64240, length 00x0000:  4500 0028 00f6 0000 8006 243d b465 310c  E..(......$=.e1.0x0010:  c0a8 6f83 0050 baf4 0070 54f5 9ad5 424b  ..o..P...pT...BK0x0020:  5010 faf0 b17b 0000 0000 0000 0000       P....{........
19:43:31.273168 IP 180.101.49.12.80 > 192.168.111.131.47860: Flags [P.], seq 1:1441, ack 167, win 64240, length 14400x0000:  4500 05c8 00f7 0000 8006 1e9c b465 310c  E............e1.0x0010:  c0a8 6f83 0050 baf4 0070 54f5 9ad5 424b  ..o..P...pT...BK0x0020:  5018 faf0 9b3f 0000 4854 5450 2f31 2e31  P....?..HTTP/1.10x0030:  2032 3030 204f 4b0d 0a41 6363 6570 742d  .200.OK..Accept-0x0040:  5261 6e67 6573 3a20 6279 7465 730d 0a43  Ranges:.bytes..C0x0050:  6163 6865 2d43 6f6e 7472 6f6c 3a20 7072  ache-Control:.pr0x0060:  6976 6174 652c 206e 6f2d 6361 6368 652c  ivate,.no-cache,0x0070:  206e 6f2d 7374 6f72 652c 2070 726f 7879  .no-store,.proxy0x0080:  2d72 6576 616c 6964 6174 652c 206e 6f2d  -revalidate,.no-0x0090:  7472 616e 7366 6f72 6d0d 0a43 6f6e 6e65  transform..Conne0x00a0:  6374 696f 6e3a 206b 6565 702d 616c 6976  ction:.keep-aliv0x00b0:  650d 0a43 6f6e 7465 6e74 2d4c 656e 6774  e..Content-Lengt0x00c0:  683a 2032 3338 310d 0a43 6f6e 7465 6e74  h:.2381..Content0x00d0:  2d54 7970 653a 2074 6578 742f 6874 6d6c  -Type:.text/html0x00e0:  0d0a 4461 7465 3a20 5468 752c 2031 3520  ..Date:.Thu,.15.0x00f0:  4f63 7420 3230 3230 2030 323a 3433 3a33  Oct.2020.02:43:30x0100:  3220 474d 540d 0a45 7461 673a 2022 3538  2.GMT..Etag:."580x0110:  3836 3034 6338 2d39 3464 220d 0a4c 6173  8604c8-94d"..Las0x0120:  742d 4d6f 6469 6669 6564 3a20 4d6f 6e2c  t-Modified:.Mon,0x0130:  2032 3320 4a61 6e20 3230 3137 2031 333a  .23.Jan.2017.13:0x0140:  3237 3a33 3620 474d 540d 0a50 7261 676d  27:36.GMT..Pragm0x0150:  613a 206e 6f2d 6361 6368 650d 0a53 6572  a:.no-cache..Ser0x0160:  7665 723a 2062 6665 2f31 2e30 2e38 2e31  ver:.bfe/1.0.8.10x0170:  380d 0a53 6574 2d43 6f6f 6b69 653a 2042  8..Set-Cookie:.B0x0180:  444f 525a 3d32 3733 3135 3b20 6d61 782d  DORZ=27315;.max-0x0190:  6167 653d 3836 3430 303b 2064 6f6d 6169  age=86400;.domai0x01a0:  6e3d 2e62 6169 6475 2e63 6f6d 3b20 7061  n=.baidu.com;.pa0x01b0:  7468 3d2f 0d0a 0d0a 3c21 444f 4354 5950  th=/....<!DOCTYP0x01c0:  4520 6874 6d6c 3e0d 0a3c 212d 2d53 5441  E.html>..<!--STA0x01d0:  5455 5320 4f4b 2d2d 3e3c 6874 6d6c 3e20  TUS.OK--><html>.0x01e0:  3c68 6561 643e 3c6d 6574 6120 6874 7470  <head><meta.http0x01f0:  2d65 7175 6976 3d63 6f6e 7465 6e74 2d74  -equiv=content-t0x0200:  7970 6520 636f 6e74 656e 743d 7465 7874  ype.content=text0x0210:  2f68 746d 6c3b 6368 6172 7365 743d 7574  /html;charset=ut0x0220:  662d 383e 3c6d 6574 6120 6874 7470 2d65  f-8><meta.http-e0x0230:  7175 6976 3d58 2d55 412d 436f 6d70 6174  quiv=X-UA-Compat0x0240:  6962 6c65 2063 6f6e 7465 6e74 3d49 453d  ible.content=IE=0x0250:  4564 6765 3e3c 6d65 7461 2063 6f6e 7465  Edge><meta.conte0x0260:  6e74 3d61 6c77 6179 7320 6e61 6d65 3d72  nt=always.name=r0x0270:  6566 6572 7265 723e 3c6c 696e 6b20 7265  eferrer><link.re0x0280:  6c3d 7374 796c 6573 6865 6574 2074 7970  l=stylesheet.typ0x0290:  653d 7465 7874 2f63 7373 2068 7265 663d  e=text/css.href=0x02a0:  6874 7470 3a2f 2f73 312e 6264 7374 6174  http://s1.bdstat0x02b0:  6963 2e63 6f6d 2f72 2f77 7777 2f63 6163  ic.com/r/www/cac0x02c0:  6865 2f62 646f 727a 2f62 6169 6475 2e6d  he/bdorz/baidu.m0x02d0:  696e 2e63 7373 3e3c 7469 746c 653e e799  in.css><title>..0x02e0:  bee5 baa6 e4b8 80e4 b88b efbc 8ce4 bda0  ................0x02f0:  e5b0 b1e7 9fa5 e981 933c 2f74 6974 6c65  .........</title0x0300:  3e3c 2f68 6561 643e 203c 626f 6479 206c  ></head>.<body.l0x0310:  696e 6b3d 2330 3030 3063 633e 203c 6469  ink=#0000cc>.<di0x0320:  7620 6964 3d77 7261 7070 6572 3e20 3c64  v.id=wrapper>.<d0x0330:  6976 2069 643d 6865 6164 3e20 3c64 6976  iv.id=head>.<div0x0340:  2063 6c61 7373 3d68 6561 645f 7772 6170  .class=head_wrap0x0350:  7065 723e 203c 6469 7620 636c 6173 733d  per>.<div.class=0x0360:  735f 666f 726d 3e20 3c64 6976 2063 6c61  s_form>.<div.cla0x0370:  7373 3d73 5f66 6f72 6d5f 7772 6170 7065  ss=s_form_wrappe0x0380:  723e 203c 6469 7620 6964 3d6c 673e 203c  r>.<div.id=lg>.<0x0390:  696d 6720 6869 6465 666f 6375 733d 7472  img.hidefocus=tr0x03a0:  7565 2073 7263 3d2f 2f77 7777 2e62 6169  ue.src=//www.bai0x03b0:  6475 2e63 6f6d 2f69 6d67 2f62 645f 6c6f  du.com/img/bd_lo0x03c0:  676f 312e 706e 6720 7769 6474 683d 3237  go1.png.width=270x03d0:  3020 6865 6967 6874 3d31 3239 3e20 3c2f  0.height=129>.</0x03e0:  6469 763e 203c 666f 726d 2069 643d 666f  div>.<form.id=fo0x03f0:  726d 206e 616d 653d 6620 6163 7469 6f6e  rm.name=f.action0x0400:  3d2f 2f77 7777 2e62 6169 6475 2e63 6f6d  =//www.baidu.com0x0410:  2f73 2063 6c61 7373 3d66 6d3e 203c 696e  /s.class=fm>.<in0x0420:  7075 7420 7479 7065 3d68 6964 6465 6e20  put.type=hidden.0x0430:  6e61 6d65 3d62 646f 727a 5f63 6f6d 6520  name=bdorz_come.0x0440:  7661 6c75 653d 313e 203c 696e 7075 7420  value=1>.<input.0x0450:  7479 7065 3d68 6964 6465 6e20 6e61 6d65  type=hidden.name0x0460:  3d69 6520 7661 6c75 653d 7574 662d 383e  =ie.value=utf-8>0x0470:  203c 696e 7075 7420 7479 7065 3d68 6964  .<input.type=hid0x0480:  6465 6e20 6e61 6d65 3d66 2076 616c 7565  den.name=f.value0x0490:  3d38 3e20 3c69 6e70 7574 2074 7970 653d  =8>.<input.type=0x04a0:  6869 6464 656e 206e 616d 653d 7273 765f  hidden.name=rsv_0x04b0:  6270 2076 616c 7565 3d31 3e20 3c69 6e70  bp.value=1>.<inp0x04c0:  7574 2074 7970 653d 6869 6464 656e 206e  ut.type=hidden.n0x04d0:  616d 653d 7273 765f 6964 7820 7661 6c75  ame=rsv_idx.valu0x04e0:  653d 313e 203c 696e 7075 7420 7479 7065  e=1>.<input.type0x04f0:  3d68 6964 6465 6e20 6e61 6d65 3d74 6e20  =hidden.name=tn.0x0500:  7661 6c75 653d 6261 6964 753e 3c73 7061  value=baidu><spa0x0510:  6e20 636c 6173 733d 2262 6720 735f 6970  n.class="bg.s_ip0x0520:  745f 7772 223e 3c69 6e70 7574 2069 643d  t_wr"><input.id=0x0530:  6b77 206e 616d 653d 7764 2063 6c61 7373  kw.name=wd.class0x0540:  3d73 5f69 7074 2076 616c 7565 206d 6178  =s_ipt.value.max0x0550:  6c65 6e67 7468 3d32 3535 2061 7574 6f63  length=255.autoc0x0560:  6f6d 706c 6574 653d 6f66 6620 6175 746f  omplete=off.auto0x0570:  666f 6375 733e 3c2f 7370 616e 3e3c 7370  focus></span><sp0x0580:  616e 2063 6c61 7373 3d22 6267 2073 5f62  an.class="bg.s_b0x0590:  746e 5f77 7222 3e3c 696e 7075 7420 7479  tn_wr"><input.ty0x05a0:  7065 3d73 7562 6d69 7420 6964 3d73 7520  pe=submit.id=su.0x05b0:  7661 6c75 653d e799 bee5 baa6 e4b8 80e4  value=..........0x05c0:  b88b 2063 6c61 7373                      ...class
19:43:31.273193 IP 192.168.111.131.47860 > 180.101.49.12.80: Flags [.], ack 1441, win 17280, length 00x0000:  4500 0028 18ae 4000 4006 0c85 c0a8 6f83  E..(..@.@.....o.0x0010:  b465 310c baf4 0050 9ad5 424b 0070 5a95  .e1....P..BK.pZ.0x0020:  5010 4380 634c 0000                      P.C.cL..
19:43:31.273472 IP 180.101.49.12.80 > 192.168.111.131.47860: Flags [P.], seq 1441:2782, ack 167, win 64240, length 13410x0000:  4500 0565 00f8 0000 8006 1efe b465 310c  E..e.........e1.0x0010:  c0a8 6f83 0050 baf4 0070 5a95 9ad5 424b  ..o..P...pZ...BK0x0020:  5018 faf0 47ac 0000 3d22 6267 2073 5f62  P...G...="bg.s_b0x0030:  746e 223e 3c2f 7370 616e 3e20 3c2f 666f  tn"></span>.</fo0x0040:  726d 3e20 3c2f 6469 763e 203c 2f64 6976  rm>.</div>.</div0x0050:  3e20 3c64 6976 2069 643d 7531 3e20 3c61  >.<div.id=u1>.<a0x0060:  2068 7265 663d 6874 7470 3a2f 2f6e 6577  .href=http://new0x0070:  732e 6261 6964 752e 636f 6d20 6e61 6d65  s.baidu.com.name0x0080:  3d74 6a5f 7472 6e65 7773 2063 6c61 7373  =tj_trnews.class0x0090:  3d6d 6e61 763e e696 b0e9 97bb 3c2f 613e  =mnav>......</a>0x00a0:  203c 6120 6872 6566 3d68 7474 703a 2f2f  .<a.href=http://0x00b0:  7777 772e 6861 6f31 3233 2e63 6f6d 206e  www.hao123.com.n0x00c0:  616d 653d 746a 5f74 7268 616f 3132 3320  ame=tj_trhao123.0x00d0:  636c 6173 733d 6d6e 6176 3e68 616f 3132  class=mnav>hao120x00e0:  333c 2f61 3e20 3c61 2068 7265 663d 6874  3</a>.<a.href=ht0x00f0:  7470 3a2f 2f6d 6170 2e62 6169 6475 2e63  tp://map.baidu.c0x0100:  6f6d 206e 616d 653d 746a 5f74 726d 6170  om.name=tj_trmap0x0110:  2063 6c61 7373 3d6d 6e61 763e e59c b0e5  .class=mnav>....0x0120:  9bbe 3c2f 613e 203c 6120 6872 6566 3d68  ..</a>.<a.href=h0x0130:  7474 703a 2f2f 762e 6261 6964 752e 636f  ttp://v.baidu.co0x0140:  6d20 6e61 6d65 3d74 6a5f 7472 7669 6465  m.name=tj_trvide0x0150:  6f20 636c 6173 733d 6d6e 6176 3ee8 a786  o.class=mnav>...0x0160:  e9a2 913c 2f61 3e20 3c61 2068 7265 663d  ...</a>.<a.href=0x0170:  6874 7470 3a2f 2f74 6965 6261 2e62 6169  http://tieba.bai0x0180:  6475 2e63 6f6d 206e 616d 653d 746a 5f74  du.com.name=tj_t0x0190:  7274 6965 6261 2063 6c61 7373 3d6d 6e61  rtieba.class=mna0x01a0:  763e e8b4 b4e5 90a7 3c2f 613e 203c 6e6f  v>......</a>.<no0x01b0:  7363 7269 7074 3e20 3c61 2068 7265 663d  script>.<a.href=0x01c0:  6874 7470 3a2f 2f77 7777 2e62 6169 6475  http://www.baidu0x01d0:  2e63 6f6d 2f62 646f 727a 2f6c 6f67 696e  .com/bdorz/login0x01e0:  2e67 6966 3f6c 6f67 696e 2661 6d70 3b74  .gif?login&amp;t0x01f0:  706c 3d6d 6e26 616d 703b 753d 6874 7470  pl=mn&amp;u=http0x0200:  2533 4125 3246 2532 4677 7777 2e62 6169  %3A%2F%2Fwww.bai0x0210:  6475 2e63 6f6d 2532 6625 3366 6264 6f72  du.com%2f%3fbdor0x0220:  7a5f 636f 6d65 2533 6431 206e 616d 653d  z_come%3d1.name=0x0230:  746a 5f6c 6f67 696e 2063 6c61 7373 3d6c  tj_login.class=l0x0240:  623e e799 bbe5 bd95 3c2f 613e 203c 2f6e  b>......</a>.</n0x0250:  6f73 6372 6970 743e 203c 7363 7269 7074  oscript>.<script0x0260:  3e64 6f63 756d 656e 742e 7772 6974 6528  >document.write(0x0270:  273c 6120 6872 6566 3d22 6874 7470 3a2f  '<a.href="http:/0x0280:  2f77 7777 2e62 6169 6475 2e63 6f6d 2f62  /www.baidu.com/b0x0290:  646f 727a 2f6c 6f67 696e 2e67 6966 3f6c  dorz/login.gif?l0x02a0:  6f67 696e 2674 706c 3d6d 6e26 753d 272b  ogin&tpl=mn&u='+0x02b0:  2065 6e63 6f64 6555 5249 436f 6d70 6f6e  .encodeURICompon0x02c0:  656e 7428 7769 6e64 6f77 2e6c 6f63 6174  ent(window.locat0x02d0:  696f 6e2e 6872 6566 2b20 2877 696e 646f  ion.href+.(windo0x02e0:  772e 6c6f 6361 7469 6f6e 2e73 6561 7263  w.location.searc0x02f0:  6820 3d3d 3d20 2222 203f 2022 3f22 203a  h.===."".?."?".:0x0300:  2022 2622 292b 2022 6264 6f72 7a5f 636f  ."&")+."bdorz_co0x0310:  6d65 3d31 2229 2b20 2722 206e 616d 653d  me=1")+.'".name=0x0320:  2274 6a5f 6c6f 6769 6e22 2063 6c61 7373  "tj_login".class0x0330:  3d22 6c62 223e e799 bbe5 bd95 3c2f 613e  ="lb">......</a>0x0340:  2729 3b3c 2f73 6372 6970 743e 203c 6120  ');</script>.<a.0x0350:  6872 6566 3d2f 2f77 7777 2e62 6169 6475  href=//www.baidu0x0360:  2e63 6f6d 2f6d 6f72 652f 206e 616d 653d  .com/more/.name=0x0370:  746a 5f62 7269 6963 6f6e 2063 6c61 7373  tj_briicon.class0x0380:  3d62 7269 2073 7479 6c65 3d22 6469 7370  =bri.style="disp0x0390:  6c61 793a 2062 6c6f 636b 3b22 3ee6 9bb4  lay:.block;">...0x03a0:  e5a4 9ae4 baa7 e593 813c 2f61 3e20 3c2f  .........</a>.</0x03b0:  6469 763e 203c 2f64 6976 3e20 3c2f 6469  div>.</div>.</di0x03c0:  763e 203c 6469 7620 6964 3d66 7443 6f6e  v>.<div.id=ftCon0x03d0:  3e20 3c64 6976 2069 643d 6674 436f 6e77  >.<div.id=ftConw0x03e0:  3e20 3c70 2069 643d 6c68 3e20 3c61 2068  >.<p.id=lh>.<a.h0x03f0:  7265 663d 6874 7470 3a2f 2f68 6f6d 652e  ref=http://home.0x0400:  6261 6964 752e 636f 6d3e e585 b3e4 ba8e  baidu.com>......0x0410:  e799 bee5 baa6 3c2f 613e 203c 6120 6872  ......</a>.<a.hr0x0420:  6566 3d68 7474 703a 2f2f 6972 2e62 6169  ef=http://ir.bai0x0430:  6475 2e63 6f6d 3e41 626f 7574 2042 6169  du.com>About.Bai0x0440:  6475 3c2f 613e 203c 2f70 3e20 3c70 2069  du</a>.</p>.<p.i0x0450:  643d 6370 3e26 636f 7079 3b32 3031 3726  d=cp>&copy;2017&0x0460:  6e62 7370 3b42 6169 6475 266e 6273 703b  nbsp;Baidu&nbsp;0x0470:  3c61 2068 7265 663d 6874 7470 3a2f 2f77  <a.href=http://w0x0480:  7777 2e62 6169 6475 2e63 6f6d 2f64 7574  ww.baidu.com/dut0x0490:  792f 3ee4 bdbf e794 a8e7 99be e5ba a6e5  y/>.............0x04a0:  898d e5bf 85e8 afbb 3c2f 613e 266e 6273  ........</a>&nbs0x04b0:  703b 203c 6120 6872 6566 3d68 7474 703a  p;.<a.href=http:0x04c0:  2f2f 6a69 616e 7969 2e62 6169 6475 2e63  //jianyi.baidu.c0x04d0:  6f6d 2f20 636c 6173 733d 6370 2d66 6565  om/.class=cp-fee0x04e0:  6462 6163 6b3e e684 8fe8 a781 e58f 8de9  dback>..........0x04f0:  a688 3c2f 613e 266e 6273 703b e4ba ac49  ..</a>&nbsp;...I0x0500:  4350 e8af 8130 3330 3137 33e5 8fb7 266e  CP...030173...&n0x0510:  6273 703b 203c 696d 6720 7372 633d 2f2f  bsp;.<img.src=//0x0520:  7777 772e 6261 6964 752e 636f 6d2f 696d  www.baidu.com/im0x0530:  672f 6773 2e67 6966 3e20 3c2f 703e 203c  g/gs.gif>.</p>.<0x0540:  2f64 6976 3e20 3c2f 6469 763e 203c 2f64  /div>.</div>.</d0x0550:  6976 3e20 3c2f 626f 6479 3e20 3c2f 6874  iv>.</body>.</ht0x0560:  6d6c 3e0d 0a                             ml>..
19:43:31.273481 IP 192.168.111.131.47860 > 180.101.49.12.80: Flags [.], ack 2782, win 20160, length 00x0000:  4500 0028 18af 4000 4006 0c84 c0a8 6f83  E..(..@.@.....o.0x0010:  b465 310c baf4 0050 9ad5 424b 0070 5fd2  .e1....P..BK.p_.0x0020:  5010 4ec0 52cf 0000                      P.N.R...
19:43:31.274349 IP 192.168.111.131.47860 > 180.101.49.12.80: Flags [F.], seq 167, ack 2782, win 20160, length 00x0000:  4500 0028 18b0 4000 4006 0c83 c0a8 6f83  E..(..@.@.....o.0x0010:  b465 310c baf4 0050 9ad5 424b 0070 5fd2  .e1....P..BK.p_.0x0020:  5011 4ec0 52ce 0000                      P.N.R...
19:43:31.274956 IP 180.101.49.12.80 > 192.168.111.131.47860: Flags [.], ack 168, win 64239, length 00x0000:  4500 0028 00f9 0000 8006 243a b465 310c  E..(......$:.e1.0x0010:  c0a8 6f83 0050 baf4 0070 5fd2 9ad5 424c  ..o..P...p_...BL0x0020:  5010 faef a69e 0000 0000 0000 0000       P.............
19:43:31.312963 IP 180.101.49.12.80 > 192.168.111.131.47860: Flags [FP.], seq 2782, ack 168, win 64239, length 00x0000:  4500 0028 00fa 0000 8006 2439 b465 310c  E..(......$9.e1.0x0010:  c0a8 6f83 0050 baf4 0070 5fd2 9ad5 424c  ..o..P...p_...BL0x0020:  5019 faef a695 0000 0000 0000 0000       P.............
19:43:31.312985 IP 192.168.111.131.47860 > 180.101.49.12.80: Flags [.], ack 2783, win 20160, length 00x0000:  4500 0028 0000 4000 4006 2533 c0a8 6f83  E..(..@.@.%3..o.0x0010:  b465 310c baf4 0050 9ad5 424c 0070 5fd3  .e1....P..BL.p_.0x0020:  5010 4ec0 52cd 0000                      P.N.R...

三次握手到四次分手是不可被分割的最小粒度

通过负载均衡器这个场景我们可以想一下,

第一次发给了s1服务器,第二次发的包仍然只能发给s1,不能发给s2,如果发生错发情况,s1没有后面的步骤,s2没有前面的步骤,那么最终结果就是s1、s2都会失败,那么对应的就是c端也会失败,双方都开辟不了资源,交互不了,连接失败。

Socket

文件描述符

说socket之前,先了解下linux的“一切皆文件”。

exec 8<> /dev/tcp/www.baidu.com/80
路径必须是/dev/tcp

<>表示输入输出,这个8指向了后面的socket链接,/dev/tcp/www.baidu.com/80看似是一个文件路径,其实是linux一切皆文件的特性,linux内核会将路径转换成与百度的一个tcp socket链接,用8指向了这个连接,通过操作这个文件可以从连接中可以输入流输出流。
这个8的术语就叫 文件描述符 file descriptor,如同java中的变量

获取输入输出流

echo -e "GET / HTTP/1.0\n" 1>& 8
-e是为了解析\n,1表示标准输出,在linux中,“>”是将结果到文件中,而“>&”是到另一个文件中
cat 0<& 8
0表示标准输入

其实说的上面那么多,就为了表达一个意思:一个socket连接,可以用一个文件描述符来表示

socket套接字

ip+port:ip+port
通过netstat -natp 查看目前的连接,同一个客户端访问服务端一个端口,套接字中,一定有一个维度来区分不同的连接,所以socket套接字,就是ip+port套上ip+port,一个随机端口号访问一个ip上的固定端口号

ip:是互联网中主机定位用的,也就是可以通过ip找到这个主机
port:找到主机之后,而这个主机中有很多进程,那你要把这个数据包交给那个进程,通过这个端口号来找到程序的进程或线程。

服务端的端口号是固定的,比如tomcat的8080,客户端的端口号是随机的,最多65535个,但是不要认为一台机器总共只能随机65535个,你要明白套接字,他们是一组,不能只看一半,也就是说如果再连另外一台机器,依然能建立65535个链接。即使端口号重复了,但是整个socket是不重复的。
上面是基于客户端,那么服务端呢,建立了65535个链接,那服务端消耗了几个端口号呢:没错,只会消耗1个,如图所示。

那么他们怎么通信的呢,上面也说了,三次握手之后,建立连接(两端资源的开辟),在建立连接的时候,同时也会fock出一个进程或者线程,将socket与这个进程或线程进行绑定,那持有是怎样的一个形式呢,你别忘了,我们上面建立的一个socket,以一个文件描述符8来体现,那么这个线程或者进程只对这个文件描述符8进行读写就可以了,也就是说在fock线程或者进程的时候,socket被描述成了文件描述符,然后把这个文件描述符与fock出的线程或者进程绑定起来,然后这个线程或进程只对这个文件描述符8进行操作就行了。

通过上图,我们知道了现在是一个线程或者进程对应一个socket,那多个socket能不能对应一个进程或线程呢??—这个知识点就是多路复用器 epoll,意思也就是说一个进程或线程对应多个客户端,避免浪费资源

就是你应用层组装数据,然后递给下一层–传输控制层,下层知道了你想要连接,然后就帮你趟路,进行握手,看路通不通、好不好走,然后准备好第一次握手包之后就停住了,因为这个包不是传输层发出去的,这个包怎么发出去,怎么找到对方主机,不是我控制层做的,所以就开始调用网络层、…层,通过网关 mac地址找到对方主机,每一层都有协议,最后就是,各层各司其职,上面的层都是阻塞的。

Tcp三次握手、四次分手,Socket再看不懂,你砍我相关推荐

  1. TCP三次握手/四次分手详解

    TCP三次握手/四次分手详解                         | ------------------TCP(Transmission Control Protocol) 传输控制协议 ...

  2. TCP三次握手四次分手不一样的解释

    前言 关于这个问题,网上有很多教程和博客,都大同小异.但我看了之后,并不认同.那些复杂的解释给我一种"看着答案推过程"的牵强感觉,经不住推敲. 一,连接为什么是三次握手,而不是两次 ...

  3. java 中的网络编程(Socket、TCP三次握手四次挥手、TCP/UDP/URL)

    文章目录 前言 一.网络编程概述 二.网络通信要素概述 1.如何实现网络中的主机互相通信 2.网络通信协议 3.IP和端口号 4.InetAddress类 5.网络协议 6.TCP/IP协议簇 7.T ...

  4. TCP三次握手四次挥手简介

    TCP三次握手四次挥手简介 图解三次握手.四次挥手 建立连接:三次握手 关闭连接:四次挥手 上图传递过程中出现的几个字符(SYN,ACK,FIN,seq,ack)各代表什么意思 SYN,ACK,FIN ...

  5. TCP三次握手四次挥手(图解)

    <TCP-IP协议栈概略图与TCP三次握手四次挥手> 目录 1 TCP过程详解 1.1 三次握手 1.2 四次挥手 2 使用tcpdump分析三次握手的过程 2.1 tcpdump抓包和t ...

  6. TCP三次握手四次挥手过程及其中的状态量

    网上看到过一些有关TCP三次握手四次挥手的过程,觉得有必要总结一下了,对于了解TCP的过程还是有帮助的 1.变量含义 SYN表示建立连接, FIN表示关闭连接, ACK表示响应, PSH表示有 DAT ...

  7. wireshark抓tcp三次握手四次挥手包

    wireshark抓tcp三次握手四次挥手包 首先大家要连接,tcp建立连接的过程是我们要了解的,了解了之后才能传送数据嘛. 大家要搞清除过程才行,在我前面的博客具体的讲了怎么样建立的,这里只讲抓包. ...

  8. TCP三次握手四次挥手详解

    TCP三次握手四次挥手 1. TCP报文格式 2. TCP连接需要解决的问题 3. 三次握手 4. 四次挥手 5. 一些补充问题 1. TCP报文格式 在了解三次握手和四次挥手之前,先知道TCP报文内 ...

  9. TCP三次握手四次断开及11种状态转变

    TCP三次握手四次断开及11种状态转变 置位概念: 根据TCP的包头字段,存在三个重要的标识ACK.SYN.FIN ACK: 表示验证字段 SYN: 位数置为1,表示建立TCP连接 FIN: 位数置为 ...

  10. java锁一次交互二次握手_Java后台开发面试实战(二):TCP三次握手四次挥手

    感谢牛客网网友提供的面试经验! 1. 解释一下TCP三次握手四次挥手 图片来源于微信公众号:码农求职小助手 答: 嗯(稍作思考)- 三次握手简单来说,在数据传输开始前: 第一次握手:客户端向服务端发送 ...

最新文章

  1. 如何将Sql Server中的数据表导入到PowerDesigner中
  2. 全球及中国手机便携式移动电源行业营销模式及投资竞争力分析报告2021-2027年版
  3. 学会了Python之后,我的职业生涯突飞猛进
  4. 微博爬取显示全文_Python爬虫---chrome driver爬取微博(教你几十行代码爬取财宝宝微博长文)...
  5. 将Nginx添加到系统服务(使其可使用service命令控制)
  6. ELK:ElasticSearch定期关闭和删除索引脚本
  7. 神经网络之BP算法【图文并茂】
  8. 【mmDetection框架解读】入门篇一、各组件解读,配置文件解读
  9. springboot+nodejs+vue+Elementui高校课外学科竞赛管理系统
  10. 微信测试之本地接口测试-ngrok
  11. Qtum量子链QIP-5提案:在智能合约交易输出脚本上增加签名证明,允许用户以代付方式调用合约
  12. 联想服务器重装系统按f几,联想笔记本电脑重装系统按F几
  13. java ssh实现原理_SSH三大框架的工作原理及流程
  14. 车贴服务器维修,汽车衡的故障分析及处理
  15. SpringBoot + Vue 的物流仓库管理系统源码
  16. ReadProcessMemory Types of actual and formal var parameters must be identical
  17. POJ1753 flip Game翻转棋盘
  18. Java学习笔记———选择结构
  19. 【UltraISO】中文破解版
  20. LM324芯片介绍及其应用电路

热门文章

  1. 使用51单片机和MAX7219控制点阵滚动显示
  2. 舔狗舔到最后一无所有 (线性dp)
  3. u-boot-2014.10移植第18天----添加DM9000网卡支持(二)
  4. Python异常:SyntaxError: Non-ASCII character ‘\xe4’ in file…解析
  5. DG维护常用命令---oracle DG dataguard
  6. 《Java150道面试题全集》
  7. 生态链 (topsort
  8. 苹果CMS接入个人支付收款GOGO支付插件
  9. 【LeetCode - 277】搜寻名人
  10. susan角点检测算法