인프런 모든 개발자를 위한 HTTP 웹 기본 지식 - 김영한  강좌를 보고 정리한 내용이며 내용중 사용된 사진들은 해당 강좌의 수업자료에서 발췌하였습니다.

 

IP(Internet Protocol)

 

클라이언트와 서버가 통신할 때 필요한 프로토콜이다. 클라이언트와 서버가 단순한 선 한개로 연결되어 있으면 좋겠지만 우리는 인터넷을 이용해서 통신을 한다. 클라이언트가 가진 IP가 100.0.0.1 이고 서버가 가진 IP가 200.0.1 이라고 가정한다면 클라이언트는 시작지점의 프로토콜과 목적지 프로토콜을 가지고 서버로 보낸다. 목적지로 가는 길에는 수많은 노드들이 있다. 단순하게 IP주소로만 통신을 한다면 노드를 거치면서 패킷이 유실될 수도 있고, 목적지의 서버가 꺼져있다면 도달하지 못하는 문제가 있을 수도 있다.

 

IP 프로토콜은 다음과 같은 한계점이 있다.

  • 비연결성 - 패킷을 받을 대상이 없거나 서비스 불능 상태여도 패킷을 전송한다.
  • 비신뢰성 - 중간에 패킷이 사라지거나 패킷이 순서대로 오지 않을 수도 있다.
  • 프로그램 구분 - 같은 IP를 사용하는 서버에서 통신하는 애플리케이션이 두개 이상이면 문제가 생긴다.

 

 

 

TCP, UCP

인터넷 프로토콜 4계층

 

예를 들어 채팅 프로그램으로 문자를 보내려고 한다. 프로그램이 'Hello World!' 라는 메세지를 보낸다면 메세지를 생성하고 SOCKET 라이브러리를 통해서 전송계층에 메세지를 넘긴다. 그러면 TCP는 TCP정보를 메세지 데이터에 씌운다. 그리고 IP계층으로 가서 IP에 대한 정보들을 씌워서 IP패킷을 생성한다. IP패킷은 IP와 관련된 정보가 있고 그 안에 TCP와 관련된 정보가 있고 그 안에 메세지에 대한 정보를 가지고 있는 것이다. 그리고 네트워크 인터페이스 계층에서 LAN카드를 통해서 나갈 때 Ethernet Frame이 포함이 되어서 나간다.

 

TCP/IP 패킷에는 출발지 port, 목적지 port, 전송제어, 순서, 검증 정보 등의 정보가 담겨있는 TCP세그먼트를 출발지 IP, 목적지 IP등의 정보가 담겨있는 IP패킷이 감싸고 있는 형태가 된다.

 

TCP는 3way handshake를 통해서 IP의 문제점이었던 비연결성과 비신뢰성, 프로그램 구분을 해결한다.

클라이언트가 서버에 데이터를 전송하기 전에 먼저 서버와 정확히 연결이 되어 있는지 파악한 후에 데이터를 전송하는 과정이다. 

먼저 클라이언트가 서버에게 SYN을 보내면 서버는 SYN+ACK를 응답한다. 그러면 클라이언트는 연결이 되어있구나 라고 판단하여 ACK를 다시 보낸다. 이렇게 3번에 걸쳐서 connection을 체크하는 것이다. 그 후에 실제 데이터를 전송한다.

이런 3way handshake을 통해서 비연결성을 해결하고, 중간에 패킷이 유실되는 것을 방지하기 때문에 비신뢰성을 해결할 수 있다. 또 한 TCP로 데이터를 전송하면 출발지 port, 목적지 port, 순서와 같은 정보를 함께 전송하기 때문에 한번에 둘 이상의 연결을 했을 때 어디에 필요한 정보인지 알 수 있고(port의 역할) 데이터의 순서도 보장이 된다.

IP는 아파트라면 PORT는 동호수라고 이해하면 된다.

 

UDP는 3way handshake도 없고 데이터 전달 보증도 되지 않고 순서도 보장되지 않는다. 기능이 거의 없어서 IP와 거의 같다. 하지만 단순하고 빠르기 때문에 사용하기도 한다. 이미 거의 모든 인터넷이 TCP기반으로 되어있기 때문에 더욱 최적하를 하고 싶다하면 UDP를 애플리케이션 레벨에서 추가 작업을 하여 사용한다. 

 

 

 

DNS(Domain Name System)

 

IP로 통신을 하면 IP주소를 기억하기가 어려울 뿐더러 IP가 신규 IP로 변경이 되면 접근하기가 상당히 어렵다. 그래서 우리는 IP를 이해하기 쉬운 도메인으로 바꾸어 사용한다. DNS서버에 도메인명을 등록해놓으면 클라이언트는 도메인명으로 요청을 한다. 그러면 DNS서버에서는 IP주소로 응답을 한다. 그 후에 그 IP주소로 접속을 하는 것이다. 

 

 

 

 

 

 

URI(Uniform Resource Identifier)

 

URI는 자원을 식별하는 방법이다. URI는 로케이터(Locator), 이름(Name)또는 둘다 추가로 분류할 수 있다.

 

https://programmingrecoding.tistory.com/newpost/?type=post#post   -> 우리가 알고 있는 이게 URL

https:programmingrecoding:post:post -> 이런형태가 URN , 그냥 자원식별 이름의 그 자체이다.

 

위치는 변할 수 있지만, 이름은 변하지 않는다. URN 이름만으로 실제 리소스를 찾을 수 있는 방법이 보편화되지 않았다. URI와 URL을 같은 의미로 사용하기도 한다.

 

URL 문법

+ Recent posts