最近在补基础,把大师 Stven的tcp/ip
详解卷1过了一遍然后呢,就是做一个笔记
留给自己和需要的人看看哈


tcp/ip

总得来说tcp/ip是一个协议族,里面包含了很多的协议,通过这些协议呢
来达到通讯的目的。

四个层次

互联网标准七层协议
应用层
表示层
会话层
传输层
网络层
数据链路层
物理层

通常人们认为OSI模型的最上面三层(应用层、表示层和会话层)在TCP/IP组中
是一个应用层。由于TCP/IP有一个相对较弱的会话层,由TCP和RTP下的打开和
关闭连接组成,并且在TCP和UDP下的各种应用提供不同的端口号,这些功能能够
被单个的应用程序(或者那些应用程序所使用的库)增加。与此相似的是,IP是
按照将它下面的网络当作一个黑盒子的思想设计的,这样在讨论TCP/IP的时候就
可以把它当作一个独立的层。

tcp/ip 四层
应用层 Telnet ping ftp http 等
传输层 tcp upd
网络层 ip icmp igmp
链路层 以太网 网卡 网卡驱动程序

关系

下一层协议为上一层协议提供服务,上一层只要知道调用哪个服务
而不必关心下一层实现的细节,上层服务不必知道下一层是如何实现
所有的协议只要规定好每一层需要提供的服务,这样即使操作系统 or
硬件不一样, 我们协议也不用改变,需要改变的只是驱动程序。这才是
tcp/ip 从60年代末初生发展到现在全球几十亿用户的不竭动力把。我觉得
这也体现了coding 中设计的重要性,一个程序的存在时间总是在设计的时候
已经被注定了,比如unix/linux 在设计的时候就被加上了能在所有设备运行
的标签。

作用

  1. 应用层就是我们平常用到的和看到了 chrome浏览器 qq邮箱 网易邮箱
    浏览器一般使用http https 邮箱一般都是 pop3 smtp imap ,所谓应用层
    就是通过调用下一层(传输层:tcp or udp )提供的服务来完成自己的任务

  2. 传输层顾名思义就是传输的意思,应用层告诉传输层把数据发送给谁就行了
    然后运输层来传递,类似于现在的快递公司,我们把包裹给给中通然后填好信息
    交完钱就行了(应用层),快递小哥把你的包裹拿到公司。

  3. 你的包裹通过快递公司建设好的运输路线从一个地方到另外一个地方,
    最终到你的手里面。这里面的路线就是快递公司建设的运输网,我们的网络层其实
    干的就是这种事情。

  4. 运输路线需要建设,我们这一层为上一层提供的就是运输路线,我们的任务就是
    建立一个庞大的运输路线,庞大到我们可以把一个数据从一个地方发送到任何一个地方
    这就是链路层,其实说白了我们平常用的网线 光纤等都是为了建设网络的运输路线。

具体

tcp

协议应该事我们听说的最多的协议了,当初老师讲课的时候,经常提到三次握手
但是呢,老师们给出的永远都只有一个流程图,当然了大家一看图也都懂就是这个


client ——–seq:001-SYN———> server
client <——-seq:100–ACK.002—– server
client ——–seq:2–ACK.101—–> server
但是我自己用wget www.baidu.com 同时用 tcpdump 看到的确是这样的,下面的内容我自己做了删减


获取ip

这是dns 解析域名的过程,通过dns地址服务器,获取域名的地址
仔细看看有什么神秘之处,所有的域名后面都是以”.”结束,这是因为”.” 是root 即树的根节点
这是因为域名解析是从根节点开始,整个域名服务器存储就是一个树形的结构,所有如果有的
域名没有 “.” 会被认为是不完整的,为了使用方便我们从来不加”.” ,但是我们程序会自动的添加
我们发现百度的,ip地址有多个,默认情况下使用第一个
172.21.5.163.24021 > 172.21.0.2.domain: 43437+ A? www.baidu.com. (31)
172.21.5.163.44487 > 172.21.0.2.domain: 26670+ AAAA? www.baidu.com. (31)
172.21.0.2.domain > 172.21.5.163.24021: 43437 3/5/5 CNAME www.a.shifen.com., A 119.75.217.109, A 119.75.218.70 (260)
172.21.0.2.domain > 172.21.5.163.44487: 26670 1/1/0 CNAME www.a.shifen.com. (115)


建立连接

即三次握手 [S] 表示 syn标志为被设置为1
172.21.5.163.39576 > 119.75.217.109.http: Flags [S], seq 1525833967,
win 29200, options [mss 1460,sackOK,TS val 19312430 ecr 0,nop,wscale 7], length 0
119.75.217.109.http > 172.21.5.163.39576: Flags [S.], seq 4125272833, ack 1525833968,
win 29200, options [mss 1440,sackOK,p,nop,nop,wscale 7], length 0
172.21.5.163.39576 > 119.75.217.109.http: Flags [P.], seq 1:112, ack 1, win 229, length 111
最后一个确认 并且发送数据 ,俩个合并,有相应的合并算法


接收数据

以及确认 [] 里面的就是tcp标志位为1的
119.75.217.109.http > 172.21.5.163.39576: Flags [.], ack 112, win 193, length 0
119.75.217.109.http > 172.21.5.163.39576: Flags [P.], seq 1:334, ack 112, win 193, length 333
172.21.5.163.39576 > 119.75.217.109.http: Flags [.], ack 334, win 237, length 0
119.75.217.109.http > 172.21.5.163.39576: Flags [P.], seq 334:1441, ack 112, win 193, length 1107
172.21.5.163.39576 > 119.75.217.109.http: Flags [.], ack 1441, win 260, length 0
119.75.217.109.http > 172.21.5.163.39576: Flags [P.], seq 1441:2715, ack 112, win 193, length 1274
172.21.5.163.39576 > 119.75.217.109.http: Flags [.], ack 2715, win 283, length 0


终止连接

即四次挥手 : 客户端请求关闭连接,发送 Finsh 标志为,设置为1
172.21.5.163.39576 > 119.75.217.109.http: Flags [F.], seq 112, ack 2715, win 283, length 0
119.75.217.109.http > 172.21.5.163.39576: Flags [.], ack 113, win 193, length 0
119.75.217.109.http > 172.21.5.163.39576: Flags [F.], seq 2715, ack 113, win 193, length 0
172.21.5.163.39576 > 119.75.217.109.http: Flags [.], ack 2716, win 283, length 0


tcp 协议的首部

我们在上面的ip数据报的”[]” 里面的就是tcp首部的标志位,172.21.5.163.24021 ,172.21.5.163是我的ip地址
24021 是我端口号,服务器的也一样,.http 一般都是知名端口80,因为tcp是以client and server 的端口和ip组成
的四元组[client.port : server.port],来识别的,其实是端口,因为ip层获取的的tcp数据的目的地址都是本机的or
广播,而tcp,又会根据不同的数据端口的不同而送到不同的应用程序,所以对于tcp来说,程序就是一个个的端口,所以
说tcp是端到端的连接,而ip是点到点的连接。我们还会发现上面每条数据后面都有一个length + 数字,表示发送数据长度
tcp 接收数据使用缓冲计数,可以接收数据大小就是当前缓冲区空闲空间,win 237 表示还可以接收237字节
tcp首部长度通常20字节

& =======================================
& _16位源端口号||16位目的端口号
& =======================================
& _
32位序号
& =======================================
& ___32位确认号,最大2^32-1
&=======================================
4位首部_|6bit标志位————————————-|16位窗
长度 |URG ACK PSH RST SYN FIN|口大小
&=======================================
_16位检验和|16位紧急指针
&=======================================
_选项数据
&=======================================

udp 首部

通常8字节
& =======================================
&_16位源端口号||16位目的端口号
&=======================================
&_
16位UDP长度_||16位UDP检验和
&=======================================
数据(若有)
&=======================================

&=======================================

ip 数据报

&=======================================
&__IP首部|| tcp首部 || tcp数据
&=======================================

tcp udp different

tcp 是全通道,并且有超时重传,数据检验等处理,对数据有保证,
udp只有检验和,但是大部分使用udp的地方还不开这个,只使用ip数据报的
检验,特点速度块,平常使用的ping就是使用udp,tcp udp都是使用端口号
通信,但是tcp和udp端口不冲突,tcp正在使用端口10 ,udp也可以使用端口10
俩着并不冲突。

小结

看完tcp/ip 详解卷一,只有一个感觉,那就是自己的网络知识真的弱爆了

而网络编程和普通编程呢,又是俩个世界,平常我们使用的都是封装好的socket
urlconction 或者啥的,但是在深入呢,或者说让你使用linux 网络接口自己封装
一个协议来通讯。在应用层的下面,是属于网络的世界,各种算法各种协议
每一个都是为了追求速率 安全 可以说这里面的每一样你研究好了,收获非常多
因为全世界都是在用这个玩意,不论你是 电脑 手机 or 各种操作系统对于网络
都是一样的,所以真的要搞真的需要花时间来弄需要以年为单位,当然了如果只是
补充or 打网络基础,Stven 的 卷一 就足够了,有兴趣了可以卷2 劵3 最好自己能
写个网络协议或者把现有的协议自己实现一下,想必收获都是蛮多的,这里就结束
This over。