본문 바로가기
프로그래밍/웹, 네트워크

http와 tcp/ip의 이해

by Hwan2 2020. 10. 31.
반응형

1. Http? tcp/ip?

네트워크 전공이신 분들은 이 두개가 서로 상호작용 한다는 것을 알고 있을 것입니다.
 
문제는 방대한 양의 정보와 잘못된 지식인데, http와 tcp/ip를 완전 다른놈 취급한다는 사실입니다.
 
http를 까보면 tcp가 나오게 됩니다.
 
즉, tcp 기반으로 만들어진 프로토콜이 http라는 말입니다.
 
이를 이해하기 위해선 OSI 7 Layer를 이해해야 합니다.
 
하지만 너무 자세히 알 필요는 없습니다. 간략한 그림을 보여드리도록 하죠.
 

2. OSI 7 Layer

 

저희가 인터넷 주소창에 'www.google.com' 이라는 도메인 네임을 입력했다고 가정해 봅시다.

 

그럼 인터넷 창에선 www.google.com에 접속해 서비스를 받기위해 여러가지 포멧 형태가 일어나게 됩니다.

 

여기서 사용자가 www.google.com을 인터넷 주소창에 치는 모든 행위 작업들을 

 

OSI 7 Layer 중 7계층인 응용계층(Application Layer)이라고 합니다.

 

여기선 서버에 보낼 데이터와 어떤 프로토콜 방식을 사용할지에 대한 헤더가 붙게 됩니다.

 

이런 것들을 패킷 이라고 하며, 저희가 브라우저에 주소를 입력한 후 엔터를 누르는 순간, 

 

'브라우저(Application) -> 본인 컴퓨터 랜카드' 로 가기 까지 모든계층들을 지나가며 각 계층마다 패킷이 붙게 됩니다.

 

위 사진을 보시면 'Data' 부터 시작하여 점점 아래로 내려갈 수록 이것 저것 붙는것을 확인할 수 있습니다.

 

응용 계층에선 어떤 프로토콜로 통신할 지에 대한 헤더가 붙고, 

 

다음 계층인 표현계층(Presentation Layer)에서는 암호화 또는 복호화 과정에 필요한 정보들이 붙습니다.

 

세션은 연결을 위한, 표현 계층은 에러제어 및 신뢰성 확보 등..... 여러가지 정보들이 패킷에 붙어 나가게 됩니다.

 

3. HTTP == TCP??

서로 다르지만, TCP 기반으로 HTTP프로토콜이 사용됩니다. 즉, HTTP는 TCP/IP 스택에 의존하여 사용합니다.
 
따라서 HTTP는 TCP의 기능을 사용하지만, 정의된 프로토콜 자체가 다름으로 같게 보면 안됩니다.
 
하지만 HTTP가 TCP를 사용하여 데이터를 전송하기 때문에, HTTP는 TCP의 여러 특성 (예: 연결 지향성, 신뢰성, 흐름 제어 등)을 갖게 됩니다.

그럼 TCP의 특징은??

1. 연결지향적

여기서 연결지향적이란 소리는 클라이언트와 서버가 서로 연결된다는 뜻입니다.
 

2. 3 way handshaking 과 4 way handshaking 작업으로 인한 신뢰성 보장

tcp 통신을 할 때 서버가 통신할 준비가 되어 있는지, 서로 연결해서 데이터를 주고 받을 수 있는지 확인합니다.
여기서 준비가 된다면 통신을 하게되고 준비가 안된다면 서버가 준비가 안됬다는 메시지 혹은 에러등을 사용자에게 보여줄 수 있습니다.
 

3. 순서 보장

TCP를 통해 데이터를 보내게 되면 패킷의 순서가 보장됩니다. 즉 1 ~ 100번의 패킷이 보내진다면 1 ~ 100번까지 서버에 차례대로 도착하게 됩니다.
 
 
이와 반대 되는 개념인 udp가 있는데, 위 설명의 반대라고 생각하시면 됩니다.
 

UDP는 서버에 데이터를 보내고 끝. 즉, 서버와 클라이언트가 서로 연결되지 않습니다.

다시말해서 서버가 살아있던, 죽어있던 신경안쓰고 해당 주소로 데이터를 보내고 확인도 안합니다.

그로 인해 3 way handshaking 작업도 없죠. 또한 순서가 보장되지 않습니다.

 

이 tcp의 모든 특징들은 http가 갖고 있습니다.
 
왜냐? tcp를 기반으로 만들어진 패킷이 http 이기 때문이죠.
 

4. HTTP vs TCP Ssocket

사실 이 둘의 차이점은 하나입니다.
 

정해진 규칙에 의거하여 클라이언트의 요청에 대한 정보를 제공해주고 연결을 끊을 것이냐?

 

아니면 규칙 이런거 없이 서로 계속, 영원히 연결을 유지할 것이냐?

 
이 차이 입니다.
 

그럼 TCP Socket통신으로 프로그래밍을 하고 클라이언트 데이터를 받고 서버에서 클라이언트 연결을 끊으면 HTTP 아니냐?

라고 생각할 수 있습니다.
 
원리는 비슷하지만 서로 다릅니다.....
 
프로토콜이 다름으로 정의되는 헤더의 데이터가 서로 다르게 되죠.
 

TCP Socket 통신과 Http 통신을 비교해 보겠습니다.

TCP Socket

 

위 패킷은 제가 JAVA로 만든 채팅서버를 다른 컴퓨터에 설치해 접속해본 결과입니다.

 

프로토콜을 보시면 TCP기반 S101을 사용하는걸 보실 수 있으며 아래 파랗게 블록되어 있는 부분이 제가 서버로 보낸 문자열입니다.

 

HTTP

 

이건 제가 C++로 만든 http서버 입니다. Http 기반 json 통신을 하는걸 알 수 있습니다.

 

다시말해서 일반적으로 프로그래밍에 사용하는 Socket 통신은 4계층에서 시작하여 패킷이 생성되고

 

Http통신의 경우 7계층부터 시작하여 패킷이 생성됩니다.

그럼 TCP Socket으로 Http 통신을 할 수 없는가??

할 수 있습니다. 구현하면 됩니다.
 
단, 이를 코딩하려면 패킷단위의 코딩 실력이 필요하고 각 계층별로 붙는 헤더들을 정의할 줄 알아야 합니다.
또한 논블로킹 비동기 식으로 입출력을 제어하지 않기 때문에 사용자가 직접 구현해야 하죠. 
 
구현하기 어렵고 귀찮죠??
 
그래서 사용하는 것이 http프로토콜을 지원하는 API나 Framework를 사용하는 것입니다.
 
이런 것들을 사용하면 세션유지, 바인딩 등을 수월하게 할 수 있도록 기능들을 제공해주니깐요.
 
 

다시한번 말씀드리지만 HTTP는 TCP로 이뤄져 있습니다.

때문에 둘 다 3 way handshaking 작업과 4 way handshaking 작업을 거칩니다. 

 
따라서 4계층 관점으로 본다면 이 둘은 연결지향적 통신이 되는 것이고,
 
7계층 관점에서 본다면 http는 비연결(클라이언트와 서버의 연결을 유지하지 않기 때문)
socket통신은 연결지향적이 되는 것입니다.(클라이언트와 서버는 데이터를 주고받아도 계속 연결을 유지하기 때문에)
 
 
2년 동안 대학교에서 CCNA과정을 공부하면서 갖고있던 기본적인 개념 지식입니다.
 
혹시 잘못된 점이 있다면 댓글 남겨주세요.!!

 

 

 

 

반응형

댓글


스킨편집 -> html 편집에서