为什么要分层:
IEEE负责数据链路层及其以下标准的指定;
情景想象:
应用层:信封传递给某人(端到端)
传输层:酒店A----到大厦B(端到端)
网络层:圆通北京分部-----圆通广东分部;(逐跳)
链路层:首都火车站----广州火车站(介质传递)
临时端口号:1024--5000之间,例如telnet源主机使用临时端口号,访问目的主机23端口。
---------------------------------------------------------
2.通过序列号与确认应答提高可靠性
3.确认应答ACK: 收到源主机的数据包后回应已收到的消息类型;
4.序列号seq:确认应答处理、重发控制及重复控制等;
5.MSS最大传输单元:协商每块大小,最大为1500-20(TCP头部,option为0)-20(IP头部)=1460。服务器和PC一般都没有MTU链路发现功能。如果网络链路上有调整MTU的,建议也调整TCP MSS值,为MTU值-40
ISN:初始化序列号
6.滑动窗口:接收方的流控。告诉你一口气传多大给我,不用一个个确认。决定可用缓存大小,体现接收方缓存的能力。
7.窗口控制:窗口控制就是我发送多个包,我确认一个即可(确认最高seq+1)。
8.重发控制:当源主机收到三个重复的ACK,将重传指定的数据包;第二种是RTT超时,是最严重的。
9.流控制:发送端根据接收端的指示,对发送数据的量进行控制。接收主机将自己可以接收的缓冲区大小放入滑动窗口字段中通知给发送端。这个字段的值越大,说明网络的吞吐量越大。
不过当出现缓冲区溢出的情况,接收端会回seq=a+1,window=0的ACK包。发送端过了重发超时时间,若超过周期时间后,会持续发送一个"窗口探测"的包,等待接收端缓冲区好了后,回一个“窗口更新通知"。(持续发是因为怕“窗口更新通知”会丢包)
10.拥塞控制:慢启动---发起方的流控技术。定义“拥塞窗口”,在慢启动时,第一个拥塞端口的大小设置为1个数据段(1MSS)。收到ACK应答后,拥塞窗口的值就加1.发送端和接收端将比较拥塞窗口的大小,按照最小值为主去确认拥塞端口值
(拥塞窗口变化示意图------严重看不懂)
11.提高网络利用率的规范---Nagle算法(发送控制)(cisco激活命令:service nagle)原理是暂停发送一些比较小的包,用在低速链路上。虽然可以调高利用率,但是可能会发送某种程度的延迟,例如第四次握手ack
TCP头部
序列号seq和应答ACK组成了同道路双向通信的条件。
URG:紧急针,基本应用程序没有用,聊下我们在操作时按ctrl+c就是这样。
PSH:当表示1时,表示收到的数据立刻传给上层应用协议。但是现在没有应用程序搭理,因为个个都说紧急,我才不会理
RST:当表示1时,表示连接异常强制断开连接。例如防火墙reject动作,丢包同时回1个rest包;或发送给重启后的主机,因为没有收到之前的包,所以开机后收到的包都会回rest包
FIN:表示数据传完了,希望断开连接。主要有种叫”半闭连接“,发送端SYN,接收端回SYN+ACK,然后发送端一直没有回ACK,导致接收到缓存一直保留和增加,简称DOS攻击
窗口扩大选项:一种提高吞吐量的方法,只有主动连接方的第一个SYN包可以发送窗口扩大因子。
SACK:位于TCP额外的option字段,就是当丢包时,拥有选择确认每个数据帧的功能,以便确认究竟丢掉哪一个包。
-------------------------------------------------------------------------------------------------------
socket:应用在使用TCP或UDP时,会用到操作系统提供的类库。这种类库一般被称为API(应用编程接口)。
使用TCP或UDP通信时,又会广泛使用到套接字(socket)的API。套接字原来是由BSD UNIX开发的(不仅仅用于网络通信,也可以用于进程间通信),但是后来被移植到windows的winsock以及嵌入式操作系统中。应用程序利用套接字,可以设置对端的IP地址、端口号,并实现数据的发送与接收。
首先接收方有一台服务器,服务器绑定套接字(socket)的IP地址和端口号,然后处于被动侦听状态(passive open,等待用户主动访问(active open)。
TCP状态迁移;
SYN_RECV:服务器端,联想到DDOS攻击;
TIME_WAIT:主机端,等待主动发包关闭,时间为2MSL。重讲:FIN丢包及平静时间
CLOSE_WAIT:
ESTABLED:
FIN_WAIT2:容易出现死等问题