[Web] - Http 정리 - 01


이번에 인프런에서 http 강의를 결제하고 듣는 내용을 정리하고자 한다.

기본적으로는 김영한님 강의를 베이스로 하되 추가적인 내용은 공부해서 삽입했다.

목차


  • 인터넷 통신
  • IP (Internet Protocol)
  • TCP, UDP
  • PORT
  • DNS

1. 인터넷 통신


2대의 컴퓨터가 서로 통신을 하기위해 인터넷을 사용한다. 하지만 인터넷은 단순하지 않다.

아래와 같이 수많은 노드들이 연결되어 있다.

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2022-08-03_%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB_11 05 28

위의 복잡한 인터넷망에서 데이터를 송수신 하기 위해 IP가 필요하다.

2. IP (Internet Protocol)


%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2022-08-03_%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB_11 06 14

그래서 IP를 사용해 클라이언트와 서버의 IP 주소를 입력한 패킷을 만들어서 전송한다.

여기서 더 추가적으로 IP Header를 알아보자.

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2022-08-03_%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB_11 08 20

  • Version (4bit) : TCP/IP는 IPv4를 사용한다고 한다. 4 혹은 6
  • HeaderLength (4bit) : IP 헤더의 길이를 32비트 단위로 나타낸다. 대부분 해더는 20바이트이다. 즉 거의 5가 들어있따. (5*32 = 160bit , 20Byte)
  • Type-of-Service Flags : 서비스의 우선 순위를 제공한다.
  • Total Packet Length (16bit) : 전체 IP 패킷의 길이를 바이트 단위로 나타낸다.
  • Fragment Identifer (16bit) : 분열이 발생한 경우 다시 결합하기 위한 데이터 식별 값이다.

    첫번째 비트 : 예약되어있는 비트 (항상 0)

    두번째 비트 : 패킷 분할 여부 1-분할X 0-분할O

    세번째 비트 : 분할된 패킷 더 있나요? 1-더있음 0-없음

  • Fragment Offest (13bit) : 8바이트 offset으로 조각에 저장된 원래 데이터의 바이트 범위를 나타낸다.

    패킷 재조립시 패킷간 순서에 대한 정보

    %E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2022-08-03_%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB_11 18 16

  • Time-to-live TTL (8bit) : 통과가능한 라우터의 남은 수. 라우터를 경유할때마다 하나씩 줄어든다. 0이 되면 폐기

    보통 30이면 다 도착한다. TTL은 운영체제마다 다름

  • Protocol Identifier (8bit) : 상위 계층 프로토콜 1-ICMP 2-IGMP 6-TCP 17-UDP
  • Header Checksum (16bit) : IP 프로토콜 헤더 자체의 내용이 올바른가를 점검. 헤더가 손상되지 않았는지 확인용
  • Source IP Address : 발신자 IP 주소
  • Destination IP Address : 수신자 IP 주소
  • Option : 경로 배정 및 보안 등과 같은 40byte 까지의 부가정보

    Padding : IP 헤더의 크기는 16비트 의 4배수가 되어야한다. 공간이 남을 경우 채우기 위한 비트

IP 프로토콜의 한계점


  • 비연결성
    • 패킷 받을 상대가 서비스 불능이여도 패킷 전송함
  • 비신뢰성
    • 중간에 패킷 분실시?
    • 패킷 순서 어떻게 확보?
  • 프로그램 구분
    • 이 패킷을 어떤 소프트웨어에 전달해야하는가?

위와 같은 문제로 TCP를 사용한다.

3. TCP/IP


%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2022-08-03_%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB_11 24 59

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2022-08-03_%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB_11 25 23

잠깐 집고가는 TCP의 유래는 미국이 냉전시대 중계국이 터져도 살아남는 네트워크를 만들기 위해 개발되었다고 한다. 알파넷

TCP Header


%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2022-08-03_%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB_11 28 19

  • SourcePort (16bit): TCP에서는 Port라는 개념이 추가 된다. Port는 뒤에서 알아보기로 하자.
  • Destination Port (16bit)
  • Sequence number (32bit) : 시퀀스 번호는 패킷의 순서 정보를 담고 있다.

    송신자가 최초로 데이터를 전송할때는 랜덤한 숫자로 시작하고 이후 자신이 보낼 데이터의 1byte당 1씩 증가시키며 보낸다. 만약 최대값을 넘어가면 0부터 다시 시작한다.

  • Acknowledgment Number (32bit) : 승인번호는 수신자가 예상하는 다음 시퀀스 번호를 담는다.

    이때 상대방이 보낸 시퀀스 번호 + 자신이 받은 데이터 bytes 로 승인번호를 만들어낸다.

    즉, 승인 번호는 다음에 보내줘야 하는 데이터의 시작점을 의미한다.

  • Data Offset (4bit) : 헤더가 아닌 데이터가 어디서 시작되는지를 표시한다. Option필드가 가변이기때문에 필요하다.
  • Reserved (3bit) : 미래를 위해 예약된 필드. 전부 0으로 채워진다.
  • Flags (NS ~ FIN) : 9개의 비트 플래그이다.

| 필드 | 의미 | | — | — | | URG | Urgent Pointer(긴급 포인터) 필드에 값이 채워져있음을 알리는 플래그. 이 포인터가 가리키는 긴급한 데이터는 높게 처리되어 먼저 처리된다. 요즘에는 많이 사용되지 않는다. | | ACK | Acknowledgment(승인 번호) 필드에 값이 채워져있음을 알리는 플래그. 이 플래그가 0이라면 승인 번호 필드 자체가 무시된다. | | PSH | Push 플래그. 수신 측에게 이 데이터를 최대한 빠르게 응용프로그램에게 전달해달라는 플래그이다. 이 플래그가 0이라면 수신 측은 자신의 버퍼가 다 채워질 때까지 기다린다. 즉, 이 플래그가 1이라면 이 세그먼트 이후에 더 이상 연결된 세그먼트가 없음을 의미하기도 한다. | | RST | Reset 플래그. 이미 연결이 확립되어 ESTABLISHED 상태인 상대방에게 연결을 강제로 리셋해달라는 요청의 의미이다. | | SYN | Synchronize 플래그. 상대방과 연결을 생성할 때, 시퀀스 번호의 동기화를 맞추기 위한 세그먼트임을 의미한다. | | FIN | Finish 플래그. 상대방과 연결을 종료하고 싶다는 요청인 세그먼트임을 의미한다. | | NS | ECN에서 사용하는 CWR, ECE 필드가 실수나 악의적으로 은폐되는 경우를 방어하기 위해 RFC 3540에서 추가된 필드 | | ECE | ECN Echo 플래그. 해당 필드가 1이면서, SYN 플래그가 1일 때는 ECN을 사용한다고 상대방에게 알리는 의미. SYN 플래그가 0이라면 네트워크가 혼잡하니 세그먼트 윈도우의 크기를 줄여달라는 요청의 의미이다. | | CWR | 이미 ECE 플래그를 받아서, 전송하는 세그먼트 윈도우의 크기를 줄였다는 의미이다. |

  • windowSize (16bit) : 윈도우 사이드즌 한번에 전송 할 수 있는 데이터 양을 의미한다. 최대크기는 64KB인데 요즘 환경에 맞지 않다 값을 늘리기 위해 Shift 연산을 활용하고, 해당 내용은 Option에 담겨있다.
  • Checksum (16bit) : Header의 오류를 찾기위한 값이다. TCP 체크섬은 전송할 데이터를 16bit씩 나눠서 더한값으로 만든다.

    데이터를 모두 더하고 16bit를 초과하는 값은 carry라고 하며 이부분만 떼어서 다시 값에 더한다.

    그리고 1의 보수를 취해준 값을 Checksum에 저장한다.

    추후 데이터를 받은쪽에서 위처럼 16bit씩 모든 데이터를 더한값과 Checksum을 더해서 모든 값이 1이라면 정상적인 값이고 하나라도 0이면 변조되었다고 판단한다.

  • Urgent Pointer (16bit) : URP 가 1이라면 Urgent Pointer가 가르키고 있는 데이터를 우선 처리한다.
  • Options : TCP 기능을 확장하기 위한 필드들이다. 이 부분은 가변적인 데이터 셋이다. Option까지 포함하면 Header는 20~40byte 이다.

TCP 특징


  • 연결 지향 - TCP 3 way handshake (가상 연결)
  • 데이터 전달 보증
  • 순서 보장
  • 신뢰할 수 있는 프로토콜

현재는 대부분 TCP를 사용중이며 심지어 비디오도 TCP를 사용한다고 한다.

3 way handshake


%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2022-08-03_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_2 14 07

  • 양쪽 모두 데이터 전송할 준비가 되었다는 것을 보장

요즘은 3번 ACK와 함께 데이터도 같이 전송한다고 한다. 최적화 추가적으로 4 way handshake도 있는데 이건 연결을 종료할때 하는 통신이다.

순서보장


%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2022-08-03_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_2 14 21

  • 위에 TCP Header에 나온 순차번호를 활용해 순서를 확인 할 수 있다.

최적화 방식을 사용하긴 하지만, 기본적으로는 순서가 잘못된 패킷부터 다시 다 보낸다.

위 순서를 보장하는 방식에는 Sliding Window라는 개념이 나온다.

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2022-08-03_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_2 36 27

3. UDP의 특징


사용자 데이터그램 프로토콜 (User Datagram Protocol)

  • 하얀 도화지 (기능이 거의 없음)
  • 데이터 전달 및 순서가 보장되지 않지만, 단순하고 빠름
  • IP에 PORT, Checksum 기능 정도만 추가

이번에 http3 부터 udp가 주목 받고 있다고 함

4. PORT


%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2022-08-03_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_2 38 41

PORT는 하나의 IP에서 여러 소프트웨어를 구동하기 위해 필요한 개념

  • 0 ~ 65535 까지 사용 가능
  • 0 ~ 1023 : 잘 알려진 포트, 사용하지 않는게 좋음
    • FTP - 20, 21
    • TELNET - 23
    • HTTP - 80
    • HTTPS - 443

5. DNS


Domain Name Server의 약자로 쉽게 말해 전화번호 책이라고 보면 된다.

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2022-08-03_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_2 40 31

IP주소를 기억하고 있는게 아니라 도메인을 통해 접속하기 위한 시스템

해당 도메인 네임 서버에 IP와 연결이 되어야 한다.

그래서 우리가 가비아 등 서비스를 통해 네임서버 등록을 한다.

참고자료

리프의 지끈지끈 Study Note : 네이버 블로그

TCP의 헤더에는 어떤 정보들이 담겨있는걸까?

[TCP] 슬라이딩 윈도우 데이터 송신 및 승인2