TCP+HTTP学习杂记

Posted ruiruia

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP+HTTP学习杂记相关的知识,希望对你有一定的参考价值。

   关于TCP

    • TCP协议,传输控制协议(Transmission Control Protocol),是一种面向连接的,可靠的,基于字节流的传输层通信协议。
    • TCP通信需要经过创建连接,数据传送,终止连接三个步骤。
    • TCP通信模型中,在通信开始前,一定要先建立相关链接,才能发送数据
    • TCP特点:
    1.面向连接(双方的通信必须要先建立连接,并且通过这一个链接双向传输,不适用于广播的程序)
    2.可靠传输(1.采用发送应答机制,2.超时重传,3.错误校验,4.流量控制和阻塞管理)

 

技术图片

 

 

 TCP通信模型

技术图片

 

 

 

    • Client客户端:
    流程:socket对象→connect→send(recv)→close
    • Server服务器端
    流程:socket对象→bind→listen→accept→recv(send)→close
    • TCP的3次握手(打招呼)(通俗版)
    1.A→(你好,能听到吗?)→B
    2.A←(能听到,你能收到我的消息嘛?)←B
    3.A→(可以收到你的消息)→B
    
    • TCP的3次握手(正式版)
    1.客户端的SYN_SENT→→(SYN=1,seq=J)→→服务器的SYN_RCVD
    2.客户端的ESABLISHED←←(SYN=1,ACK=1,ack=J+1,seq=K)←←服务器的SYN_RCVD
    3.客户端的ESABLISHED→→(ACK=1,ack=K+1)→→服务器的ESABLISHED
    
    标志位:SYN--连接请求,ACK--确认,FIN--关闭连接
    序号:seq--报文序号,ack--确认号
    
    
    • TCP的4次挥手(说再见)
      用于断开连接,TCP的4次挥手主要是说TCP连接必须经过时间2MSL后才真正释放掉

技术图片

 

 

     主动发起的一方要等待2MSL(30s-2min)
    目的是防止最后一个ACK包对方没有收到,那么对方在超时后将重发第三次握手的FIN包,主动关闭端接到重发的FIN包后可以再发一个ACK应答包,在TIME_WAIT状态时两端的端口不能使用,要等到2MSL时间结束后才可以继续使用。当连接处于2MSL等待阶段时,任何迟到的报文段都将被丢弃。
    
连接时三次握手,关闭时四次挥手
是因为连接时SYN(用来同步)和ACK(用来应答)可以同时传输,
但关闭连接时,服务器接到FIN,并不会立即关闭socket,只能先回复一个ACK,然后把报文数据发送完之后,再发一个FIN,因此不能一起发送,需要四步握手。

 

域名
简称DN(Domain Name)
相当于IP地址是大名,域名是小名,所指的内容(人)是同一个内容(人),代号不同而已。
常见的后缀
技术图片

 

 

 localhost是个域名,不是地址,可以被配置为任意的IP地址
不过通常情况下都是指向127.0.0.1(IPv4)和::1,永远只能自己访问自己,不能访问其他人的localhost域名。

DNS服务器
Domain Name Syetem  域名解析系统
用来将域名解析成对应的IP地址
DNS是一台运行在互联网上的服务器(像通讯录,姓名→域名,电话→IP地址)

 

 

技术图片

 

 

 

 过程如图:
要访问百度网页,拿着域名(姓名)去通讯簿(DNS服务器)找IP地址(电话号码),找到之后通过connect语句发出连接请求(拨号),百度服务器接到之后(接听),开始传输网页数据(交谈)。

当我们在浏览器中输入网址,访问网站后,服务器会返回html标记给浏览器,浏览器负责渲染展现出来

电脑之间的互访只能识别IP地址的访问,不识别域名的访问


本地DNS

技术图片

 

 

     • 实际上在请求DNS服务器之前,是先去本地DNS查询的,没有查询到才去查询远程DNS服务器
    • 本地DNS服务器是一个文件
    • windows系统的路径是在C:WindowsSystem32driversetchosts
    • Ubuntu系统的路径是在/etc/hosts


HTTP
超文本传输协议,是一个客户端和服务器端请求和应答的标准
http是一种应用层协议

 

 

技术图片

 

 

 用的是请求request-响应response式模式

 技术图片

 

 

 所以,http协议分成了两个部分:请求协议、响应协议
这两种协议的组成形式是相同的(叫协议项):
协议名:协议内容(值)
例如:host:www.itcast.cn
注意:每个协议项都单独的占用一行

http协议格式查看方法:
    • 谷歌:右键,检查,network,刷新
             或者:更多,开发者工具,
             或者:F12
    • 火狐:右键,检查元素,网络,刷新
    
http的请求包含了4部分:
1.请求行(request line)2.请求头(request header)3.空行(一般是隐藏的看不出来有空行)4.请求数据(request content)
(请求头信息是浏览器发送给服务器最原始的信息)

    1. 请求行可以分成三部分:请求方式,请求路径,协议版本
    如:GET  /model/list_father.php  HTTP/1.1
    其中,GET就是请求方式,/model/list_father.php就是请求路径,HTTP/1.1就是协议版本号
    要注意的是:
        1.请求行需要单独占一行,用来说明当前请求的最基本的信息
        2.请求路径是不包括域名的
        3.HTTP协议以前是1.0版本,现在是1.1版本,不同浏览器和不同浏览器的版本之间存在差异
    2. 请求头就是所有当前需要的协议项的集合;
    协议项就是浏览器在请求服务器的时候事先告诉服务器的一些信息或者一些事先的约定
    常见的请求头内容有:
        1.host:当前url中所要请求的服务器的主机名(域名)
        2.accept-encoding:是浏览器发送给服务器,声明浏览器支持的压缩编码类型,比如gzip
        3.accept_charset:表示浏览器支持的字符集
        4.referer:表示此次请求来自哪个网址
        5.accept-language:可以接受的语言类型,cn,en有权重的高低之分
        6.cookie:如果之前当前请求的服务器在浏览器端设置了数据(cookie),那么当前浏览器再次请求的时候,就会把对应的数据带过去。
        7.user-agent:用户代理,当前发起请求的浏览器的内核信息
        8.accept:表示浏览器可以接收的数据类型(如text/html,image/img)
        9.content-length(post):只有post提交的时候才会有的请求头,显示的是当前要提交的数据的长度(字节)
        10.if-modified-since(get):表示在客户端向服务器请求某个资源文件时,询问此资源文件是否被修改过。
    3. 空行,就是用来分离请求头和请求数据,意思就是请求头到此结束
    4. 只有post方式提交的时候,才有请求数据
    
请求报文格式总结:
技术图片

 

 

 (get方式没有请求体,post方式才有请求体)

http的响应协议:
与请求类似
1.响应行2.响应头3.空行4.响应数据
    1. 响应行
第一行(如HTTP/1.1  200  OK),内容是:协议版本号  状态码  状态描述(注意状态码和状态描述是一一对应的)

技术图片

 

 

     2. 响应头:
    也是一些协议的集合   形式是  协议名:值  的形式,常见的有:
    1.server:服务器主机信息
    2.date:响应时间
    3.last-modified:文件最后修改时间
    4.content-length:响应主题的长度(字节)
    5.content-type:相应内容的数据类型(如text/html,image/png等)
    6.location:重定向。浏览器遇到这个选项,就立马跳转(不会解析后面的内容)
    7.refresh:重定向(刷新),浏览器遇到这个选项就会准备跳转,刷新一般有时间限制,时间到了才跳转,浏览器会继续向下解析
    8.content-encoding:文件编码格式
9.cache-control:缓存控制,no-cached不要缓存

技术图片

 

 

 

3.空行
作用与请求的空行相同
4.响应主体
就是服务器反馈给浏览器的数据

 技术图片

 

 长连接和短连接

技术图片

 

 技术图片

 

 技术图片

 

 技术图片

 

 

HTTP和HTTPS的区别

 

以上是关于TCP+HTTP学习杂记的主要内容,如果未能解决你的问题,请参考以下文章

机器学习杂记

Python学习杂记

学习杂记

Python学习杂记_6_字典常用操作

android 学习笔记 杂记1

Python学习杂记_4_分支和循环