HTTP와 TCP의 관계
프로그래밍할 때 HTTP를 사용 (특히 프런트와 협업할 경우 높은 확률로)
HTTP를 쓴다는 것은 하위의 TCP를 먼저 호출하게 됨(TCP를 이용하여 통신하게 됨. HTTP는 TCP 기반의 통신)
(HTTP는 Stateless / TCP는 Stateful)
(주로 TCP는 UDP와 비교를 하게 됨. 둘의 차이는 작동방식)
TCP
TCP 연결
TCP (Transmission Control Protocol)는 3-way hasndshaking 방식을 통해 신뢰성 높은 통신을 제공한다.
- Client는 SYN 플래그 비트 (x1)를 전송한다.
- Server는 ACK 플래그 비트 (x2)를 SYN와 함께 (y) 전송한다.
- Client는 ACK (x3)를 y와 함께 (y prime) 전송한다.
- SYN = synchronize / ACK = Acknowledgement
데이터를 다 돌려주게 되면 연결이 끊어지게 된다.
TCP 해제
TCP (Transmission Control Protocol)는 4-way hasndshaking 방식을 통해 신뢰성 높은 통신을 제공한다.
- CLient는 FIN 플래그 비트를 ACK (y prime)과 함께 전송한다.
- Server는 ACK 플래그 비트를 전송하고 본인은 CLOSE-WAIT 상태에 돌입
- Server는 남은 작업이 다 수행되면 FIN 플래그 비트를 전송
- Client는 FIN 플래그를 받았다는 ACK 플래그를 전송
UDP
TCP와 대척점. 확실하게 확인하지 않아 신뢰성을 보장하지 않음.
HTTP 요청과 응답
Request Message
<!-- HTTP 프로토콜을 사용하여 웹 서버로부터 "index.html" 문서를 요청하는 GET 요청의 예시 -->
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/92.0.4515.107 Safari/537.36
Accept: text/html,application/xhtml+xml,image/png
Connection: keep-alive
요청라인 (line)
- GET /index.html HTTP/1.1 : HTTP 메서드와 요청할 리소스의 경로, 그리고 사용할 프로토콜 버전을 의미한다. GET 메서드로 "/index.html" 경로에 HTTP 1.1 프로토콜을 사용함.
해더 (header)
- Host : 요청이 보내질 호스트(서무버)의 주소를 지정 (DNS, IP주소)
- User-Agent : User가 브라우저인지 등의 유저 정보를 포함하는 정보.
- Accept : 서버로부터 어떤 type의 파일을 받을지 명시할 정보
- Connection : (optional) 서버와의 연결상태를 정의할 내용
<!-- HTTP 프로토콜을 사용하여 서버에 데이터를 제출하기 위한 POST 요청의 예시 -->
POST /submit-form HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Content-Type: application/x-www-form-urlencoded
Content-Length: 27
Connection: keep-alive
name=John&email=john@example.com
해더 (header)
- Content-Type: 전송하고자 하는 데이터의 media type을 명시
- Content-Length: 요청하는 Body의 크기(Byte 단위)
바디 (body)
- 서버에 보내고자 하는 실제 데이터 (key=value & key=value 형식)
Response Message
<!-- 웹 서버에서 클라이언트에게 보내진 HTTP 응답 메시지의 예시 -->
HTTP/1.1 200 OK
Date: Thu, 28 Jul 2023 09:12:15 GMT
Server: Apache/2.4.41 (Unix)
Last-Modified: Sun, 24 Jul 2023 19:28:12 GMT
Content-Type: text/html
Content-Length: 137
Connection: keep-alive
<html><head><title>Welcome to Example.com</title></head><body><h1>Hello, world!</h1></body></html>
상태 라인 (Status Line)
- HTTP/1.1 200 : HTTP의 버전, 응답 상태코드 (Status Code)
헤더 (header)
- Date: 메세지가 전송된 시간
- Server : 소프트웨어 웹서버의 스펙
- Last-modified : 요청된 리소스의 마지막 수정 시간
바디 (Message body)
- 서버에서 받은 실제 데이터
URI
URI(Uniform Resource Identifier)는 웹 플랫폼에서 논리적 또는 물리적 리소스를 식별하는 고유한 문자 시퀀스
URI에는 URL과 URN이 있으며 URI는 리소스를 찾기 위한 식별자일 뿐 검색할 수단은 없다. 따라서 최근에는 URL, URN과 같은 식별자를 이용하여 리소스를 찾는 용도로 많이 사용된다.
- URL (Uniform Resource Locator): 리소스의 위치를 나타내는 식별자. URL은 특정 프로토콜(예: HTTP, FTP)을 사용하여 리소스의 위치를 정확하게 지정한다. 예를 들어, "https://www.example.com/index.html"은 웹 사이트의 "index.html" 파일을 가리키는 URL이다.
- URN (Uniform Resource Name): 리소스의 이름을 나타내는 식별자. URN은 리소스의 위치에 상관없이 유니크한 이름을 제공한다. URN은 주로 URN 스킴을 사용하여 정의된다.
URL 구성요소
scheme://[유저정보@]host[:port][/path][?query][#fragment]
scheme | URI의 스킴(프로토콜)을 나타냅니다. ("http", "https", "ftp" 등) |
유저정보@ | 선택적으로 사용되며, 사용자 정보(예: 사용자 이름 및 비밀번호)를 나타낸다. |
host | 리소스를 호스팅하는 서버의 호스트 이름이나 IP 주소를 나타낸다. |
port | 선택적으로 사용되며, 리소스를 호스팅하는 서버의 포트 번호를 의미한다. 생략할경우 http는 80, https는 443번으로 redirect 된다. |
/path | 선택적으로 사용되며, 리소스의 경로를 나타낸다. 웹 주소의 경우, 웹 서버의 디렉토리 구조를 나타낼 수 있다. |
?query | 선택적으로 사용되며, 리소스에 대한 추가적인 매개변수나 쿼리 문자열을 나타낸다. |
#fragment | 선택적으로 사용되며, 리소스 내의 특정 부분을 가리키는 프래그먼트 식별자를 나타낸다. 주로 웹 페이지 내에서 특정 섹션을 가리키는 데 사용된다. |
본 후기는 정보통신산업진흥원(NIPA)에서 주관하는 <AI 서비스 완성! AI+웹개발 취업캠프 - 프런트엔드&백엔드> 과정 학습/프로젝트/과제 기록으로 작성되었습니다.