network

HTTP 이란

코딩스토리 2024. 5. 25. 22:07

1. HTTP 특징


서버와 클라이언트 모델을 따르고 웹상에서 Request 와 Response 구조로 메세지를 주고받을 수 있는 프로토콜

 

 

클라이언트 서버 구조


HTTP는 요청(Request)와 응답(Response)로 구성되어 있고, 클라이언트가 요청을 하면 서버가 응답을 하는 구조

 

 

 

무상태 프로토콜(Stateless)


HTTP에서는 서버가 클라이언트의 상태를 보존하지 않기때문에 특정 서버에 의존적이지 않고 확장성이 좋다.

로그인과 같이 유저 상태를 유지해야 하는 경우엔 브라우저 쿠키, 서버 세션, 토큰등을 이용해야 한다.

 

 

 

비 연결성(Connectionless)


HTTP 1.0을 기준으로, HTTP는 기본적으로 연결을 유지하지 않는 모델. 하지만 HTTP/1.1 에서는 지속 연결이 가능하며 클라이언트 요청의 모든 응답이 온 뒤 연결을 종료.

TCP/IP는 기본적으로 연결을 유지하지만 요청과 응답이 끝나게 되면 TCP/IP 연결을 끊는다.

 

 

 

 

2. TCP와 IP의 차이


IP는 출발지 IP와 목적지 IP 정보만 있다. 하지만 출발지 IP와 목적지 IP만 있다면 중간에 패킷이 유실되어도 패킷을 받는 입장에서는 유실되었는지 알 길이 없다. 이를 보완하기 위한 정보들이 TCP 헤더에 포함되어 있다. 전송제어, 순서정보, 검증정보 등이 포함되어 있어서 데이터를 받는 입장에서는 어떤 데이터가 유실되었고 순서가 맞지 않는지 알 수 있다.

 

또한 TCP는 출발지 PORT와 목적지 PORT가 있는데 이는 같은 IP 내에서 다른 프로세스들을 구분해준다.

 

결론은 IP는 출발지 IP와 목적지 IP만 가진 프로토콜이며 TCP는 그외 PORT 정보와 여러 제어 정보를 포함하고 있다는 차이가 있다.

 

 

 

3. TCP의 연결 설정 과정


 

3-way HandShake


연결의 신뢰성 보장을 위해 수행

 

1. 클라이언트가 서버에게 접속 요청하는 SYN 플래그를 보낸다.
2. 서버는 연결을 수락한다는 의미로 SYN, ACK를 전송한다.
3. 클라이언트는 SYN에 1을 더해 ACK에 저장하고 서버에 전송하면 클라이언트와 서버는 TCP 통신 연결.

 

 


4-way HandShake


데이터 전송이 끝난 뒤 논리적으로 연결을 해제 하기 위해 사용

 

1. 클라이언트가 서버에게 연결 해제 FIN을 보낸다.
2. 서버는 승인의 의미로 클라이언트에게 ACK를 보낸다.
3. 서버는 연결 해제 준비 완료 FIN을 클라이언트에게 보낸다.
4. 클라이언트는 ACK를 전송하고 연결을 종료한다.

 

 

TCP의 연결 설정 과정(3단계)과 연결 종료 과정(4단계)이 단계가 차이나는 이유?


Client가 데이터 전송을 마쳤다고 하더라도 Server는 아직 보낼 데이터가 남아 있을 수 있기 때문에 일단 FIN에 대한 ACK만 보내고, 데이터를 모두 전송한 후에 자신도 FIN 메세지를 보내기 때문이라고 볼 수 있다.

 

 

 

 

5. HTTP, TCP, UDP


HTTP


클라이언트에서 서버로 Request를 보내고 서버가 Response하는 방식.
TCP 위에서 동작하지만 TCP 와는 다르게 비연결지향적인 단방향 통신.

 

 

TCP


TCP 통신은 Handshake라는 과정으로 서로가 통신 할 수 있는 상태인지를 먼저 인증 후에 통신.
연결지향적인 양방향 통신.
연결형 서비스로 3-way handshaking 과정을 통해 연결을 설정하기 때문에 높은 신뢰성을 보장하지만, 속도가 비교적 느리다는 단점.

 

 

UDP


비연결형 서비스로 3-way handshaking을 사용하지 않기 때문에 신뢰성이 떨어지는 단점이 있지만, 데이터 수신 여부를 확인하지 않기 때문에 속도가 빠르다는 장점.
논리적인 연결 확인, 해제 작업 없이 클라이언트에서 요청이 들어오면 서버는 데이터를 클라이언트에게 전송.

 

 

 

6. http://www.google.com 에 접속하는 과정 


1. 사용자가 브라우저에서 URL을 입력한다.
2. 응용계층에서 Request Message를 생성한다.
3. 응용계층에서 DNS 서버에 URL에 해당하는 IP주소를 검색한다.
4. HTTP요청 메세지를 완성하고 TCP 전송계층에 전달한다.
5. TCP 전송계층에서 TCP 헤더를 추가하고 IP계층에 IP헤더를 추가한 뒤 2계층과 1계층을 거쳐 서버로 패킷 을 보낸다.
6. 서버의 전송계층에서 패킷을 UNPACK한 후 메세지를 복원한다.
7. 서버의 HTTP URL을 통해 응용계층에서 처리한 후 Response 메세지를 생성한다.
8. Request Message의 정보를 이용해 TCP 헤더와 IP헤더를 추가한다.
9. 2계층과 1계층을 거쳐 다시 클라이언트로 패킷을 보낸다.
10. 클라이언트는 Response Message가 브라우저로 전달되면  HTML 랜더링을 통해 모니터에 보여진다.

 

 

 

 

7. connection timeout , socket timeout , read timeout


  •  connection timeout
    •  ConnectionTimeout 이란 3-way HandShake가 정상적으로 수행되어 서버에 연결되기까지 소요된 시간이다.
  • socket timeout
    • SocketTimeout 이란 데이터를 여러 개의 패킷으로 나누어 보낼때 각 패킷간의 시간 Gap을 이야기한다.
  • read timeout
    • Connection 맺은 후 Response(응답)을 받기까지 소요될 시간의 임계치이다.