本文学习笔记来源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,就是要表达我想要结束的意思。
- 客户端发送想要结束的包
- 服务端对结束的包给客户端做出响应
- 服务端再次发送数据包。服务端是不是也想要停止呢,主动说出来,当它认为确实可以断开了,没数据传输了,那就结束吧,也发送一个结束包,给客户端
- 客户端对服务端的结束包做出响应,好的 我收到了
与三次握手的区别在于多了第三步,需要双方都确认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 bytes
19: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,现在三次握手结束,建立连接(两端开辟资源)
是传输控制层控制的,所以数据包长度都为0
19: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
百度回一个ack
19: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 0
0x0000: 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 0
0x0000: 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 0
0x0000: 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 166
0x0000: 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./.HT
0x0030: 5450 2f31 2e31 0d0a 5573 6572 2d41 6765 TP/1.1..User-Age
0x0040: 6e74 3a20 6375 726c 2f37 2e31 392e 3720 nt:.curl/7.19.7.
0x0050: 2869 3338 362d 7265 6468 6174 2d6c 696e (i386-redhat-lin
0x0060: 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.l
0x0090: 6962 6964 6e2f 312e 3138 206c 6962 7373 ibidn/1.18.libss
0x00a0: 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..A
0x00c0: 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 0
0x0000: 4500 0028 00f6 0000 8006 243d b465 310c E..(......$=.e1.
0x0010: c0a8 6f83 0050 baf4 0070 54f5 9ad5 424b ..o..P...pT...BK
0x0020: 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 1440
0x0000: 4500 05c8 00f7 0000 8006 1e9c b465 310c E............e1.
0x0010: c0a8 6f83 0050 baf4 0070 54f5 9ad5 424b ..o..P...pT...BK
0x0020: 5018 faf0 9b3f 0000 4854 5450 2f31 2e31 P....?..HTTP/1.1
0x0030: 2032 3030 204f 4b0d 0a41 6363 6570 742d .200.OK..Accept-
0x0040: 5261 6e67 6573 3a20 6279 7465 730d 0a43 Ranges:.bytes..C
0x0050: 6163 6865 2d43 6f6e 7472 6f6c 3a20 7072 ache-Control:.pr
0x0060: 6976 6174 652c 206e 6f2d 6361 6368 652c ivate,.no-cache,
0x0070: 206e 6f2d 7374 6f72 652c 2070 726f 7879 .no-store,.proxy
0x0080: 2d72 6576 616c 6964 6174 652c 206e 6f2d -revalidate,.no-
0x0090: 7472 616e 7366 6f72 6d0d 0a43 6f6e 6e65 transform..Conne
0x00a0: 6374 696f 6e3a 206b 6565 702d 616c 6976 ction:.keep-aliv
0x00b0: 650d 0a43 6f6e 7465 6e74 2d4c 656e 6774 e..Content-Lengt
0x00c0: 683a 2032 3338 310d 0a43 6f6e 7465 6e74 h:.2381..Content
0x00d0: 2d54 7970 653a 2074 6578 742f 6874 6d6c -Type:.text/html
0x00e0: 0d0a 4461 7465 3a20 5468 752c 2031 3520 ..Date:.Thu,.15.
0x00f0: 4f63 7420 3230 3230 2030 323a 3433 3a33 Oct.2020.02:43:3
0x0100: 3220 474d 540d 0a45 7461 673a 2022 3538 2.GMT..Etag:."58
0x0110: 3836 3034 6338 2d39 3464 220d 0a4c 6173 8604c8-94d"..Las
0x0120: 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..Pragm
0x0150: 613a 206e 6f2d 6361 6368 650d 0a53 6572 a:.no-cache..Ser
0x0160: 7665 723a 2062 6665 2f31 2e30 2e38 2e31 ver:.bfe/1.0.8.1
0x0170: 380d 0a53 6574 2d43 6f6f 6b69 653a 2042 8..Set-Cookie:.B
0x0180: 444f 525a 3d32 3733 3135 3b20 6d61 782d DORZ=27315;.max-
0x0190: 6167 653d 3836 3430 303b 2064 6f6d 6169 age=86400;.domai
0x01a0: 6e3d 2e62 6169 6475 2e63 6f6d 3b20 7061 n=.baidu.com;.pa
0x01b0: 7468 3d2f 0d0a 0d0a 3c21 444f 4354 5950 th=/....<!DOCTYP
0x01c0: 4520 6874 6d6c 3e0d 0a3c 212d 2d53 5441 E.html>..<!--STA
0x01d0: 5455 5320 4f4b 2d2d 3e3c 6874 6d6c 3e20 TUS.OK--><html>.
0x01e0: 3c68 6561 643e 3c6d 6574 6120 6874 7470 <head><meta.http
0x01f0: 2d65 7175 6976 3d63 6f6e 7465 6e74 2d74 -equiv=content-t
0x0200: 7970 6520 636f 6e74 656e 743d 7465 7874 ype.content=text
0x0210: 2f68 746d 6c3b 6368 6172 7365 743d 7574 /html;charset=ut
0x0220: 662d 383e 3c6d 6574 6120 6874 7470 2d65 f-8><meta.http-e
0x0230: 7175 6976 3d58 2d55 412d 436f 6d70 6174 quiv=X-UA-Compat
0x0240: 6962 6c65 2063 6f6e 7465 6e74 3d49 453d ible.content=IE=
0x0250: 4564 6765 3e3c 6d65 7461 2063 6f6e 7465 Edge><meta.conte
0x0260: 6e74 3d61 6c77 6179 7320 6e61 6d65 3d72 nt=always.name=r
0x0270: 6566 6572 7265 723e 3c6c 696e 6b20 7265 eferrer><link.re
0x0280: 6c3d 7374 796c 6573 6865 6574 2074 7970 l=stylesheet.typ
0x0290: 653d 7465 7874 2f63 7373 2068 7265 663d e=text/css.href=
0x02a0: 6874 7470 3a2f 2f73 312e 6264 7374 6174 http://s1.bdstat
0x02b0: 6963 2e63 6f6d 2f72 2f77 7777 2f63 6163 ic.com/r/www/cac
0x02c0: 6865 2f62 646f 727a 2f62 6169 6475 2e6d he/bdorz/baidu.m
0x02d0: 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 .........</title
0x0300: 3e3c 2f68 6561 643e 203c 626f 6479 206c ></head>.<body.l
0x0310: 696e 6b3d 2330 3030 3063 633e 203c 6469 ink=#0000cc>.<di
0x0320: 7620 6964 3d77 7261 7070 6572 3e20 3c64 v.id=wrapper>.<d
0x0330: 6976 2069 643d 6865 6164 3e20 3c64 6976 iv.id=head>.<div
0x0340: 2063 6c61 7373 3d68 6561 645f 7772 6170 .class=head_wrap
0x0350: 7065 723e 203c 6469 7620 636c 6173 733d per>.<div.class=
0x0360: 735f 666f 726d 3e20 3c64 6976 2063 6c61 s_form>.<div.cla
0x0370: 7373 3d73 5f66 6f72 6d5f 7772 6170 7065 ss=s_form_wrappe
0x0380: 723e 203c 6469 7620 6964 3d6c 673e 203c r>.<div.id=lg>.<
0x0390: 696d 6720 6869 6465 666f 6375 733d 7472 img.hidefocus=tr
0x03a0: 7565 2073 7263 3d2f 2f77 7777 2e62 6169 ue.src=//www.bai
0x03b0: 6475 2e63 6f6d 2f69 6d67 2f62 645f 6c6f du.com/img/bd_lo
0x03c0: 676f 312e 706e 6720 7769 6474 683d 3237 go1.png.width=27
0x03d0: 3020 6865 6967 6874 3d31 3239 3e20 3c2f 0.height=129>.</
0x03e0: 6469 763e 203c 666f 726d 2069 643d 666f div>.<form.id=fo
0x03f0: 726d 206e 616d 653d 6620 6163 7469 6f6e rm.name=f.action
0x0400: 3d2f 2f77 7777 2e62 6169 6475 2e63 6f6d =//www.baidu.com
0x0410: 2f73 2063 6c61 7373 3d66 6d3e 203c 696e /s.class=fm>.<in
0x0420: 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.name
0x0460: 3d69 6520 7661 6c75 653d 7574 662d 383e =ie.value=utf-8>
0x0470: 203c 696e 7075 7420 7479 7065 3d68 6964 .<input.type=hid
0x0480: 6465 6e20 6e61 6d65 3d66 2076 616c 7565 den.name=f.value
0x0490: 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>.<inp
0x04c0: 7574 2074 7970 653d 6869 6464 656e 206e ut.type=hidden.n
0x04d0: 616d 653d 7273 765f 6964 7820 7661 6c75 ame=rsv_idx.valu
0x04e0: 653d 313e 203c 696e 7075 7420 7479 7065 e=1>.<input.type
0x04f0: 3d68 6964 6465 6e20 6e61 6d65 3d74 6e20 =hidden.name=tn.
0x0500: 7661 6c75 653d 6261 6964 753e 3c73 7061 value=baidu><spa
0x0510: 6e20 636c 6173 733d 2262 6720 735f 6970 n.class="bg.s_ip
0x0520: 745f 7772 223e 3c69 6e70 7574 2069 643d t_wr"><input.id=
0x0530: 6b77 206e 616d 653d 7764 2063 6c61 7373 kw.name=wd.class
0x0540: 3d73 5f69 7074 2076 616c 7565 206d 6178 =s_ipt.value.max
0x0550: 6c65 6e67 7468 3d32 3535 2061 7574 6f63 length=255.autoc
0x0560: 6f6d 706c 6574 653d 6f66 6620 6175 746f omplete=off.auto
0x0570: 666f 6375 733e 3c2f 7370 616e 3e3c 7370 focus></span><sp
0x0580: 616e 2063 6c61 7373 3d22 6267 2073 5f62 an.class="bg.s_b
0x0590: 746e 5f77 7222 3e3c 696e 7075 7420 7479 tn_wr"><input.ty
0x05a0: 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 0
0x0000: 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 1341
0x0000: 4500 0565 00f8 0000 8006 1efe b465 310c E..e.........e1.
0x0010: c0a8 6f83 0050 baf4 0070 5a95 9ad5 424b ..o..P...pZ...BK
0x0020: 5018 faf0 47ac 0000 3d22 6267 2073 5f62 P...G...="bg.s_b
0x0030: 746e 223e 3c2f 7370 616e 3e20 3c2f 666f tn"></span>.</fo
0x0040: 726d 3e20 3c2f 6469 763e 203c 2f64 6976 rm>.</div>.</div
0x0050: 3e20 3c64 6976 2069 643d 7531 3e20 3c61 >.<div.id=u1>.<a
0x0060: 2068 7265 663d 6874 7470 3a2f 2f6e 6577 .href=http://new
0x0070: 732e 6261 6964 752e 636f 6d20 6e61 6d65 s.baidu.com.name
0x0080: 3d74 6a5f 7472 6e65 7773 2063 6c61 7373 =tj_trnews.class
0x0090: 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.n
0x00c0: 616d 653d 746a 5f74 7268 616f 3132 3320 ame=tj_trhao123.
0x00d0: 636c 6173 733d 6d6e 6176 3e68 616f 3132 class=mnav>hao12
0x00e0: 333c 2f61 3e20 3c61 2068 7265 663d 6874 3</a>.<a.href=ht
0x00f0: 7470 3a2f 2f6d 6170 2e62 6169 6475 2e63 tp://map.baidu.c
0x0100: 6f6d 206e 616d 653d 746a 5f74 726d 6170 om.name=tj_trmap
0x0110: 2063 6c61 7373 3d6d 6e61 763e e59c b0e5 .class=mnav>....
0x0120: 9bbe 3c2f 613e 203c 6120 6872 6566 3d68 ..</a>.<a.href=h
0x0130: 7474 703a 2f2f 762e 6261 6964 752e 636f ttp://v.baidu.co
0x0140: 6d20 6e61 6d65 3d74 6a5f 7472 7669 6465 m.name=tj_trvide
0x0150: 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.bai
0x0180: 6475 2e63 6f6d 206e 616d 653d 746a 5f74 du.com.name=tj_t
0x0190: 7274 6965 6261 2063 6c61 7373 3d6d 6e61 rtieba.class=mna
0x01a0: 763e e8b4 b4e5 90a7 3c2f 613e 203c 6e6f v>......</a>.<no
0x01b0: 7363 7269 7074 3e20 3c61 2068 7265 663d script>.<a.href=
0x01c0: 6874 7470 3a2f 2f77 7777 2e62 6169 6475 http://www.baidu
0x01d0: 2e63 6f6d 2f62 646f 727a 2f6c 6f67 696e .com/bdorz/login
0x01e0: 2e67 6966 3f6c 6f67 696e 2661 6d70 3b74 .gif?login&t
0x01f0: 706c 3d6d 6e26 616d 703b 753d 6874 7470 pl=mn&u=http
0x0200: 2533 4125 3246 2532 4677 7777 2e62 6169 %3A%2F%2Fwww.bai
0x0210: 6475 2e63 6f6d 2532 6625 3366 6264 6f72 du.com%2f%3fbdor
0x0220: 7a5f 636f 6d65 2533 6431 206e 616d 653d z_come%3d1.name=
0x0230: 746a 5f6c 6f67 696e 2063 6c61 7373 3d6c tj_login.class=l
0x0240: 623e e799 bbe5 bd95 3c2f 613e 203c 2f6e b>......</a>.</n
0x0250: 6f73 6372 6970 743e 203c 7363 7269 7074 oscript>.<script
0x0260: 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/b
0x0290: 646f 727a 2f6c 6f67 696e 2e67 6966 3f6c dorz/login.gif?l
0x02a0: 6f67 696e 2674 706c 3d6d 6e26 753d 272b ogin&tpl=mn&u='+
0x02b0: 2065 6e63 6f64 6555 5249 436f 6d70 6f6e .encodeURICompon
0x02c0: 656e 7428 7769 6e64 6f77 2e6c 6f63 6174 ent(window.locat
0x02d0: 696f 6e2e 6872 6566 2b20 2877 696e 646f ion.href+.(windo
0x02e0: 772e 6c6f 6361 7469 6f6e 2e73 6561 7263 w.location.searc
0x02f0: 6820 3d3d 3d20 2222 203f 2022 3f22 203a h.===."".?."?".:
0x0300: 2022 2622 292b 2022 6264 6f72 7a5f 636f ."&")+."bdorz_co
0x0310: 6d65 3d31 2229 2b20 2722 206e 616d 653d me=1")+.'".name=
0x0320: 2274 6a5f 6c6f 6769 6e22 2063 6c61 7373 "tj_login".class
0x0330: 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.baidu
0x0360: 2e63 6f6d 2f6d 6f72 652f 206e 616d 653d .com/more/.name=
0x0370: 746a 5f62 7269 6963 6f6e 2063 6c61 7373 tj_briicon.class
0x0380: 3d62 7269 2073 7479 6c65 3d22 6469 7370 =bri.style="disp
0x0390: 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>.</di
0x03c0: 763e 203c 6469 7620 6964 3d66 7443 6f6e v>.<div.id=ftCon
0x03d0: 3e20 3c64 6976 2069 643d 6674 436f 6e77 >.<div.id=ftConw
0x03e0: 3e20 3c70 2069 643d 6c68 3e20 3c61 2068 >.<p.id=lh>.<a.h
0x03f0: 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.hr
0x0420: 6566 3d68 7474 703a 2f2f 6972 2e62 6169 ef=http://ir.bai
0x0430: 6475 2e63 6f6d 3e41 626f 7574 2042 6169 du.com>About.Bai
0x0440: 6475 3c2f 613e 203c 2f70 3e20 3c70 2069 du</a>.</p>.<p.i
0x0450: 643d 6370 3e26 636f 7079 3b32 3031 3726 d=cp>©2017&
0x0460: 6e62 7370 3b42 6169 6475 266e 6273 703b nbsp;Baidu
0x0470: 3c61 2068 7265 663d 6874 7470 3a2f 2f77 <a.href=http://w
0x0480: 7777 2e62 6169 6475 2e63 6f6d 2f64 7574 ww.baidu.com/dut
0x0490: 792f 3ee4 bdbf e794 a8e7 99be e5ba a6e5 y/>.............
0x04a0: 898d e5bf 85e8 afbb 3c2f 613e 266e 6273 ........</a>&nbs
0x04b0: 703b 203c 6120 6872 6566 3d68 7474 703a p;.<a.href=http:
0x04c0: 2f2f 6a69 616e 7969 2e62 6169 6475 2e63 //jianyi.baidu.c
0x04d0: 6f6d 2f20 636c 6173 733d 6370 2d66 6565 om/.class=cp-fee
0x04e0: 6462 6163 6b3e e684 8fe8 a781 e58f 8de9 dback>..........
0x04f0: a688 3c2f 613e 266e 6273 703b e4ba ac49 ..</a> ...I
0x0500: 4350 e8af 8130 3330 3137 33e5 8fb7 266e CP...030173...&n
0x0510: 6273 703b 203c 696d 6720 7372 633d 2f2f bsp;.<img.src=//
0x0520: 7777 772e 6261 6964 752e 636f 6d2f 696d www.baidu.com/im
0x0530: 672f 6773 2e67 6966 3e20 3c2f 703e 203c g/gs.gif>.</p>.<
0x0540: 2f64 6976 3e20 3c2f 6469 763e 203c 2f64 /div>.</div>.</d
0x0550: 6976 3e20 3c2f 626f 6479 3e20 3c2f 6874 iv>.</body>.</ht
0x0560: 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 0
0x0000: 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 0
0x0000: 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 0
0x0000: 4500 0028 00f9 0000 8006 243a b465 310c E..(......$:.e1.
0x0010: c0a8 6f83 0050 baf4 0070 5fd2 9ad5 424c ..o..P...p_...BL
0x0020: 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 0
0x0000: 4500 0028 00fa 0000 8006 2439 b465 310c E..(......$9.e1.
0x0010: c0a8 6f83 0050 baf4 0070 5fd2 9ad5 424c ..o..P...p_...BL
0x0020: 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 0
0x0000: 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地址找到对方主机,每一层都有协议,最后就是,各层各司其职,上面的层都是阻塞的。