10번줄 Fcntl(file control) 시스템콜F_GETFL(GET Flag) : 그 소켓에 대해 이전에 플래그가 설정되어 있으면 그것을 얻어와라 라는의미 11번줄 O_NONBLOCK(Option nonblock)즉 기존에 있던 flag를 int형 숫자로 리턴하게끔해서 거기에 nonblock옵션을 새로 추가하게 하기 위한 줄이다. stdineof는 키보드로부터 Ctrl+D가 눌렸는지에 대한 플래그이다. 우리 케이스에선 10,12,14번줄 필요하지 않다. 통상적으로 복잡한 프로그램에 쓰기 때문에 썼음.파일을 nonblock하게끔 설정하는것이 file control == Fcntl시스템콜이다. select 했을때 nonblock 된다. readable 또는 writable한 일이 없는 경우 블럭 되지 ..
non block i/o를 사용하면 성능이 몇배 이상 좋아진다.하지만 구현하기가 복잡하며, 내공이 깊어야 한다. 우리가 여태 짠 클라이언트 프로그램에서는 키보드로부터(stdin) Fgets를 통해서 스트링을 읽어오며 소켓에 write를하고 서버에서 에코가 오면 소켓으로 부터 read한 뒤에 다시 모니터에 Fputs를 통해 출력하게 된다. 즉 read2번 write2번을 하게 되며 각 과정이 모두 블럭될수 있다. write가 블럭 되는 경우는 쓰려고 하는 데이터가 버퍼보다 더 큰 경우이다. 그렇기 때문에 블럭시키지 말고 파일이 readable 또는 writable 한 상태가 아니라면 -1을 리턴시키고 바로 다른일을 할수 있게끔 하는게 non blocking i/o이다. Fgets로 키보드로 입력받은것을 소..
alarm(5);를 호출. 12번째 줄의 if문은 5초가 지났을때 실행되고 else문은 5초 이내에 데이터가 서버로부터 도착한 경우에 실행된다.데이터가 5초 이내에 정상적으로 온 경우에는 알람을 그 즉시 꺼주어야 알람이 만료되어서 시그널 핸들러가 호출되는 일을 막을수있다. 이렇게 시그널을 통해서 타임아웃을 발생 시키는 일은 아주 경험이 많은 상태가 아니고선 지양하는게 좋다. 멀티 쓰레딩 환경에서 여러가지 오류를 일으킬 수가 있다. select나 poll의 매개변수에 시간을 설정해서 타임아웃을 발생시키는게 제일 좋은 방법이다. 위의 함수는 sec이내에 원하는 데이터가 수신 되었는지를 확인하기 위한 함수이다.(select 활용) 소켓 옵션에 리시브 타이머를 설정해 놓을수있다. 소켓 종류에 상관없이 설정이 가..
I/O에 대한 타임아웃 설정하는 방식 1.시스템콜의 인자로 타임을 설정하는 방법2.sigalram을 사용하는 방법 클라이언트가 connect시스템콜을 호출했는데 서버 기계는 존재하지만 프로세스가 존재하지 않는 경우서버 커널이 리셋 메세지를 돌려줌. 클라이언트가 connect시스템콜을 호출했는데 서버 기계가 존재하지 않는 경우타임아웃 발생함. 타임아웃 재전송 타이머는 9분이 넘기 때문에 굉장히 길다.따라서 connect에 인자로 시간을 설정해서 내가 따로 타임아웃시간을 설정할 수 있다. SIGALRM 이벤트가 발생했을때 connect_alarm시스템콜을 발생 시키라고 8번줄에서 signal함수로 등록함.근데 시그널 핸들러가 리턴 될때 프로세스가 시스템콜 호출때문에 블럭 되어 있던 상태라면 그 블럭에서 -1..
/etc/resolv.conf 에 resolver configuration files이 존재한다. 이 conf 파일에 네임서버 주소가 적혀있다.(계속해서 쌓인다)resolver code는 conf파일에서 도메인이름에 대한 아이피주소가 없는 경우로컬 dns 주소를 읽어서 그 서버에게 udp요청을 한다.(tcp도가능) 이 local 네임 서버에 그 네임에 대한 아이피 주소 정보가 없으면 상위 도메인 네임 서버에게 요청 하고 거기에도 없으면 또 상위에 요청한다.한국에는 korea 전체를 커버하는 네임서버가 존재하고 각 국의 네임서버를 커버하는 네임서버가 미국 캘리포니아(dns 루트)에 위치한다고 한다. 만약에 내가 어떤 도메인을 사용하고 싶은 경우 한국 도메인 네임 서버에 등록을 해놓으면 나중에 그 정보가 루..
tcp에서는 사진1,2,3을 따로 구분하지 않고 그냥 바이트 스트림을 보낸다.사진1이 lost된 경우 그 뒤의 패킷들이 클라이언트로 도착한다 하더라도 앞에 있는것이 도착하지 않았으므로 커널의 네트워크 버퍼에 큐잉한다.처음에 TCP는 고백앤 방식을 사용해서 못 받은 패킷 뒤의 수신된 패킷들을 모두 버렸지만, 나중에 셀렉티브 애크놀로지 방식으로 바뀌어서나중에 빠진 패킷만 따로 재전송 한다. 사진2의 첫번째 패킷,3의 첫번째,1의 두번째 패킷을 받았을때 클라이언트가 첫번째 사진에 대한 첫번째 패킷에 대한 애크를 날리지 않을것이므로 서버가 다시 재전송 한다. 클라이언트가 이 패킷을 받았을때 유저 프로세스로 버퍼에서 옮겨준다.따라서 lost패킷의 재전송이 일어날때까지 나머지 패킷들은 커널 버퍼에만 있고 유저 프로..
스트림 1,2는 문제 없음. 스트림3은 1,2,3,4는 전송 됬으나 5가 오지 않고 6,7,8이 먼저온 상황5번이 오면 5,6,7,8을 스트림3에 보냄. 스트림4에 5번까지는 갔으나 6번이 와야되는데 7번이 왔음.그림이 좀 잘못 됬는데 7번이 버퍼 안에 있는게 정상이다.5번까지 스트림4로 전송 됬으니까 두번째 버퍼의 위치에 7번이 위치하고 6번이 도착하면 스트림4로 전송한다. SCTP를 사용하는 에코 서버 프로그램sctp에서는 데이터를 주고받으면서 어떤 이벤트가 발생하는지를 유저프로세스에서 알게끔 해놓았다고 했다. sctp소켓을 만들고 나서 소켓 옵션을 설정하면 된다. 또한 연결 지향형이지만 udp소켓처럼 동작한다고 했으므로, 클라이언트에 대한 정보를 담기 위해서 sctp_recvmsg의 시스템콜의 매개..
SCTP는 2000년 말에 표준으로 채택된 프로토콜이다. TCP보다 더 나은 서비스를 제공하기 위한 목적으로 나타나게 되었다. TCP를 개선하라 했을때 어떤 점을 개선하면 좋을까?TCP의 경우 연결 설정 과정을 3way hand shaking을 통해서 하게 되는데, 이 과정이 별로 안전하지 않아서, 악의적인 클라이언트에 의해 공격을 받을수 있다. 1. Network layer 와 Transport layer에서 보안 서비스를 제공 하면 좋겠다.2. 네트워크 계층, 전송 계층에서의 에러상황을 유저 프로세스 상에서 알 수 있으면 좋겠다.(운영체제가 무엇이냐에 상관없이)->notification service(현재 8가지 존재)를 위한 시스템콜 존재함. 마치 UDP 소켓처럼 SCTP 소켓 하나만 사용해서 다수..
- Total
- Today
- Yesterday
- react
- rendering scope
- typescript
- design system
- async
- javascript
- reducer
- server side rendering
- mobx
- promise
- useEffect
- computed
- reflow
- reactdom
- webpack
- es6
- atomic design
- hydrate
- return type
- props
- type alias
- Next.js
- await
- Action
- react hooks
- state
- useRef
- Polyfill
- storybook
- Babel
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |